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