【问题标题】:client generated double submit cookie, cross site request forgery prevention客户端生成双重提交cookie,防止跨站请求伪造
【发布时间】:2011-01-24 17:55:08
【问题描述】:

在双重提交cookie csrf预防方案中,是否需要服务器提供cookie?

似乎我可以让客户端页面上的javascript生成并设置一个cookie“anti_csrf”,然后双重提交(一次作为cookie,由浏览器完成,一次在请求正文中)。

外部域无法读取或写入“anti_csrf”cookie 以将其包含在请求正文中。

这是安全的,还是我忽略了什么?

【问题讨论】:

    标签: javascript csrf


    【解决方案1】:

    Tgr,请阅读:

    http://jazzy.id.au/default/2010/09/20/cracking_random_number_generators_part_1.html

    攻击者所需要的只是从随机数生成器中获取一两个令牌,然后他们可以预测每个后续和之前的每个随机数(如果它不是加密安全的)。如果随机数生成是在 Javascript 中在客户端完成的,我不知道有哪个浏览器使用加密安全的随机数生成器,所以他们只需调用 Math.random() 几次就可以计算出什么为您的 cookie 生成了令牌。

    【讨论】:

      【解决方案2】:

      如果用户已经为您的域设置了“anti_csrf”cookie,那么 CSRF 攻击者就没有问题了! HTTP 请求会 cookie 一起发出,当然如果你知道值是什么,在 POST 中包含参数是很容易的。

      cookie name 不必是秘密,但 cookie value 必须是只有用户会话知道的难以猜测的秘密。这样,攻击者不知道(也无法猜测)在攻击性 HTTP 事务中放入什么内容。

      如果您将代码放在构成 cookie 值的页面上,那么您必须假设攻击者可以在您的站点上获得他/她自己的会话(即有效的“真实”登录)并检查直接打码。如果很容易弄清楚 cookie 值是如何在客户端生成的(并且,对于人类已知的任何客户端解决方案,它都会是),那么攻击者可以再次让他们的攻击页面包含正确的参数值攻击 POST。

      【讨论】:

      • 你的意思是“那样,攻击者不知道”?
      • “anti_csrf”cookie 值将被设置为一个随机的 N 字符串。我不认为攻击者猜到这一点的现实可能性?
      • 您使用的是加密安全的随机数生成器吗?如果您不是安全专家(我当然不是),请不要试图判断某物的安全性。攻击者可能非常容易了解有关客户端随机数生成的信息。记住,他们会有你的源代码!
      • 加密安全的随机数生成器意味着即使您知道最后 n 个值,也很难猜测下一个值。这不适用于这里。任何具有大范围和合理接近均匀分布的 RNG 都使得猜测不可行。
      • 这不一定是正确的,您希望依赖常规 RNG 的程度应该与您需要保护的信息的价值成正比。请记住,假设攻击者拥有所有源代码,并且知道您的服务器是如何配置的,并且知道您的 RNG 从哪里获取种子,这始终是明智的。
      【解决方案3】:

      乍一看似乎很安全,但这意味着没有 javascript 的用户无法使用您的表单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-31
        • 2019-05-26
        • 2017-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-05
        • 1970-01-01
        相关资源
        最近更新 更多