我什么时候不应该对表单使用 CSRF 保护?

信息安全 应用安全 Web应用程序 csrf
2021-09-09 19:26:56

默认情况下,我使用令牌为我的所有表单提供 CSRF 保护。

但是,我注意到另一个 Web 应用程序具有与我的一个表单类似的功能。并且他们没有使用 CSRF 令牌。

所以我认为他们没有针对这种形式防止 CSRF 攻击。

所以

问题 1)除了 CSRF 令牌之外,不应该有其他方法来防止 CSRF 对吗?

我假设答案是这是唯一的方法。因此我的主要问题是

问题 2)什么时候不应该使用 CSRF 保护?

我知道一个可能的实例,即 POST 表单针对外部 URL。

我在django docs 上阅读了它

是否还有其他不应该使用或不必要使用 CSRF 保护的情况?

更新

a) 其他 CSRF 保护方法包括用户重新认证

b)当您不需要用户登录时,您可以在不保护表单 POSTBACK 的 CSRF 的情况下逃脱。(请参阅 nbnh 的答案和评论)

2个回答

是的,使用令牌是可靠地抵御 CSRF 攻击的唯一方法。

是否需要保护取决于程序对提交的数据执行的操作。

根据经验:如果使用当前用户的权限或上下文修改数据,则需要保护。

如果未进行任何修改,则可以不进行保护。一个常见的例子是搜索表单和结果。请注意,记录哪些搜索由哪个用户完成是一种修改,因此需要保护表单。

不,令牌不是可靠地防止 CSRF 的唯一方法。
事实上,直到最近,打包的库才足够成熟,值得推荐,在此之前滚动你自己的库很有可能让事情变得更糟。

防止 CSRF 的另一种方法是重新认证。即再次询问用户他的密码。
这种方法的优点是开发人员熟悉该技术,并且不太可能搞砸。缺点是对用户不透明。
如今,由于大多数框架都内置了保护功能,并且有额外的库可用,我会说 CSRF 令牌是首选……但这不是唯一的方法。

至于 Q#2,正如@nhnb 正确写的那样,如果没有进行任何修改,则可以省略保护。
尽管考虑到它在当前框架中是多么微不足道,用户透明度和最小开销,但你最好还是把它留在里面,而不是与代码抗争将它取出......