我已经阅读了许多关于CSRF保护的文章(这是一篇好文章),以及在SO上的各种问题,但它们似乎都不足以回答我的问题。
我正在开发自己的CMS,并希望保护我的登录和评论表单。我将允许匿名用户在我的网站上发表评论。
我的网站上的所有表单都使用令牌进行保护。我已经知道这种方法,但问题是它需要一个活动会话(也就是说,在用户登录后)。登录和评论表单的问题在于它们对几乎任何人都是可访问的,而且不需要您登录 - 在这种情况下,最好的CSRF保护是什么?
在上面的链接中,我读到可能可以在用户尝试登录时创建一个“预会话”,然后继续使用通常的反CSRF方法(例如为用户会话分配令牌),但我不知道如何实现这一点。
引荐头部是一个弱解决方案,所以我想我不应该费心。据我测试,Origin头部仅在Google Chrome中受支持。那么自定义头部呢?XMLHTTPRequest似乎是一种可能性,但是,我已经在谷歌上花费了超过三个小时的时间查找有关如何在其网站上实现此安全措施的信息。但即使我可以使用自定义头部,HTTP头部也可以完全伪造,这不是使它无用吗?
那么问题来了:我应该如何保护我的登录和评论表单免受CSRF攻击?
编辑:这里是我提供的链接中的一些额外信息:
我们建议严格的引荐验证以防止登录CSRF,因为登录表单通常通过HTTPS提交,在合法请求中可靠地存在引荐头部。如果登录请求缺少引荐头部,则站点应拒绝该请求以防止恶意抑制。
还有
秘密验证令牌可以防御登录 CSRF 攻击,但开发人员经常忘记实现该防御措施,因为在登录之前没有会话可以绑定 CSRF 令牌。要使用秘密验证令牌来保护免受登录 CSRF 攻击,站点必须首先创建一个“pre-session”,实现基于令牌的 CSRF 保护,然后在成功认证后转换为真正的会话。读完上述引用后,我就无法结束这场争论。其中一个提到了使用 Referrer Header,但我不确定它是否确实增加了 Web 应用程序的安全性。
编辑2:使用 CAPTCHA 如何?