【发布时间】:2011-01-24 17:55:08
【问题描述】:
在双重提交cookie csrf预防方案中,是否需要服务器提供cookie?
似乎我可以让客户端页面上的javascript生成并设置一个cookie“anti_csrf”,然后双重提交(一次作为cookie,由浏览器完成,一次在请求正文中)。
外部域无法读取或写入“anti_csrf”cookie 以将其包含在请求正文中。
这是安全的,还是我忽略了什么?
【问题讨论】:
标签: javascript csrf
在双重提交cookie csrf预防方案中,是否需要服务器提供cookie?
似乎我可以让客户端页面上的javascript生成并设置一个cookie“anti_csrf”,然后双重提交(一次作为cookie,由浏览器完成,一次在请求正文中)。
外部域无法读取或写入“anti_csrf”cookie 以将其包含在请求正文中。
这是安全的,还是我忽略了什么?
【问题讨论】:
标签: javascript csrf
Tgr,请阅读:
http://jazzy.id.au/default/2010/09/20/cracking_random_number_generators_part_1.html
攻击者所需要的只是从随机数生成器中获取一两个令牌,然后他们可以预测每个后续和之前的每个随机数(如果它不是加密安全的)。如果随机数生成是在 Javascript 中在客户端完成的,我不知道有哪个浏览器使用加密安全的随机数生成器,所以他们只需调用 Math.random() 几次就可以计算出什么为您的 cookie 生成了令牌。
【讨论】:
如果用户已经为您的域设置了“anti_csrf”cookie,那么 CSRF 攻击者就没有问题了! HTTP 请求会与 cookie 一起发出,当然如果你知道值是什么,在 POST 中包含参数是很容易的。
cookie name 不必是秘密,但 cookie value 必须是只有用户会话知道的难以猜测的秘密。这样,攻击者不知道(也无法猜测)在攻击性 HTTP 事务中放入什么内容。
如果您将代码放在构成 cookie 值的页面上,那么您必须假设攻击者可以在您的站点上获得他/她自己的会话(即有效的“真实”登录)并检查直接打码。如果很容易弄清楚 cookie 值是如何在客户端生成的(并且,对于人类已知的任何客户端解决方案,它都会是),那么攻击者可以再次让他们的攻击页面包含正确的参数值攻击 POST。
【讨论】:
乍一看似乎很安全,但这意味着没有 javascript 的用户无法使用您的表单。
【讨论】: