我已经阅读了很多关于CSRF保护的文章(this is a good one)以及关于SO的各种问题,但是它们似乎都没有足够的信息来回答我的问题。
我正在开发自己的CMS,我想保护我的登录和评论表单。我将允许匿名用户在我的网站上发表评论。
我网站上的所有表单都使用令牌进行保护。我已经知道这种方法,但问题是它需要一个活动会话(即用户登录后)。登录和评论表单的问题在于,几乎任何人都可以访问它们,并且不需要您登录 - 在这种情况下,针对CSRF的最佳保护是什么?
在上面的链接中,我读到当用户尝试登录然后继续使用通常的反CSRF方法(例如将令牌分配给用户的会话)时,可以创建“预会话” ,但我对如何实现这一点没有任何见解。
引用者标题是一个弱解决方案,所以我想我不应该打扰。就我测试而言,Origin标题仅在Google Chrome中受支持。自定义标题怎么样? XMLHTTPRequest似乎是一种可能性,但是,我花了三个多小时在谷歌上查找一些关于如何在他们的网站上实施这样的安全措施的信息。但即使我可以使用自定义标头,也不会使它无用,因为HTTP标头可以完全伪造?
所以,问题是:我应该如何保护我的登录和评论表格免受CSRF的侵害?
修改:这是我在上面提供的链接中的一些其他信息:
我们建议使用严格的Referer验证来防止登录CSRF 因为登录表单通常通过HTTPS提交,其中Referer 标头可靠地存在于合法请求中。如果是登录请求 缺少Referer标题,该网站应拒绝保护请求 反对恶意压制。
和
秘密验证令牌可以防御登录CSRF,但开发人员 经常忘记实施防御因为,在登录之前,有 没有绑定CSRF令牌的会话。使用秘密验证 要防止登录CSRF的令牌,该网站必须首先创建一个 “presession”,实现基于令牌的CSRF保护,然后 成功验证后转换到真实会话。
在阅读上述引言后,我无法结束这一论点。其中一个提到使用引用者标题,但我不确定它是否真的增加了webapp的安全性。
编辑2:如何使用CAPTCHA?
答案 0 :(得分:3)
CSRF问题涉及使用登录用户凭据提交内容的人。这是一个很大的问题,因为恶意网站可以像刚刚浏览到您网站的任何人那样做。如果您正在谈论可以匿名使用的表单,而无需登录,则CSRF风险要小得多,因为从其他站点发布到表单所获得的收益要少得多 - 因为任何人都可以直接使用相同的权限进行操作
所以我不明白为什么需要为未登录的表单保护CSRF。
如果你确实想要这个,那么会前令牌可能在技术上类似于真实会话,但只是一个更轻量级的。除了生成的令牌之外,它不会包含任何其他内容。
编辑:关于使用PHP提供的$ _SESSION作为会话前令牌,这是PHP的标准会话机制。如果你想使用它,那么是的,那就是它。
然而,你没有被迫这样做,我个人不会这样做,因为它消耗所有访问者的服务器内存,而这并不是真的需要。对于更有效的机制,基本上你需要a)识别用户的cookie和b)存储在服务器端的东西,告诉cookie是有效的(如果需要,谁有效,意味着ip)。对于更轻量级的方法,您可以创建一个令牌,将其存储在cookie中,并在表单中生成与该令牌匹配的内容作为隐藏字段,并匹配提交中的那些(如Devesh所解释的)。后者会阻止从其他站点提交表单,前者甚至会阻止恶意站点在您的站点上进行查找并尝试将cookie设置给最终用户的情况。所以我能想到三种方法:
EDIT2:在验证码上,它们的主要用例是防止自动(暴力)登录尝试。他们也会在登录表单上解决CSRF请求的问题,但这样做有点过分。为了防止暴力登录攻击,在某些情况下可能需要它们,尽管更加用户友好的东西可能是为了不会过度降低可用性。也许像KittenAuth:)
答案 1 :(得分:0)
您无法真正保护匿名表单免受CSRF攻击。仅仅因为其他网站可以充当普通用户。我可以创建一个对匿名表单发出curl
请求的站点,并将cookie和令牌存储在变量中。然后发出第二个请求发布表单。
该脚本不是真正伪造一个请求,而只是自动发布。
CSRF的目的是防止脚本/个人代表另一个用户执行操作。那就是我试图像你一样发帖。为了防止使用令牌方法的会话/ cookie是一个很好的解决方案。因为我无法获得您的会话和令牌,除非您的网站在其他方面存在缺陷。我建议你阅读the OWASP guidelines以了解你应该注意什么。
您应该始终做的另一件事是确保“操作”始终包含POST
请求,因此我不能简单地在您的论坛上添加链接到“http://www.yoursite.com/delete.php?id=10”的图片。如果您允许GET
请求并打开包含此图片的页面,我会伪造一个请求。如果您只允许POST
,则无效。
答案 2 :(得分:0)
我认为您可以通过组合添加到表单中的隐藏字段来解决CSRF类型的问题,同时在Cookie中添加相同的值并附加用户响应。当用户回发表单时,尝试匹配隐藏字段值和来自请求的cookie值,如果两者都匹配,那么你很高兴...
答案 3 :(得分:0)
他的CSRF问题与使用登录用户凭据提交内容的人有关。这是一个很大的问题,因为恶意网站可以像刚刚浏览到您网站的任何人那样做。如果您正在谈论可以匿名使用的表单,而无需登录,那么CSRF风险就会大大减少,因为从另一个站点发布到表单所获得的收益要少得多 - 因为任何人都可以直接使用相同的权限。
所以我不知道为什么需要为未登录的表单保护CSRF。
如果你确实想要这个,那么会前令牌可能在技术上类似于真实会话,但只是一个更轻量级的。除了生成的令牌之外,它不会包含任何其他内容。