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