【发布时间】:2010-10-05 19:43:24
【问题描述】:
在 asp.net 中,我正在实现一个 IHttpModule 来缓解 CSRF 攻击。它向响应 html 中注入一个隐藏的表单参数,其中包含 GET 上的 asp.net SessionID。然后在 POST 上检查以确保隐藏参数的值与当前 SessionID 匹配。据我所知,获取 SessionID 值的唯一方法是从 cookie 中获取,恶意站点无法读取或确定该 cookie。有什么我忽略的吗?
【问题讨论】:
在 asp.net 中,我正在实现一个 IHttpModule 来缓解 CSRF 攻击。它向响应 html 中注入一个隐藏的表单参数,其中包含 GET 上的 asp.net SessionID。然后在 POST 上检查以确保隐藏参数的值与当前 SessionID 匹配。据我所知,获取 SessionID 值的唯一方法是从 cookie 中获取,恶意站点无法读取或确定该 cookie。有什么我忽略的吗?
【问题讨论】:
这种方法是正确的。您需要确保通过 GET 操作可用的所有操作都是“安全的”(无论如何这是最佳实践),因为您仅将 XSRF 保护应用于 POST。
为了额外的保险,您也可以在 GET 上使用它(通过向所有链接添加 URL 参数,并在每个 GET 请求中检查它),但这很麻烦。
如果您比较偏执,您可以为备用 ID 选择不同的随机数。即使浏览器错误地使您的会话 cookie 可被其他站点上的某些恶意 Javascript 访问,这也可以保护您。创建会话时,选择另一个大的随机数并将其存储在您的会话中。
【讨论】:
理想情况下,您希望使用会话 ID 以外的其他内容,但基本上就是这样。 OWASP 建议使用存储在用户会话中的随机表单元素名称。这样攻击者甚至无法伪造正确的隐藏字段。
【讨论】: