CSRF验证令牌:会话ID是否安全?

6
在asp.net中,我正在实现一个IHttpModule来缓解CSRF攻击。它会在GET请求中向响应的html中注入一个隐藏的表单参数,该参数包含asp.net SessionID。在POST请求中,它会检查隐藏参数的值是否与当前SessionID匹配。据我所知,获取SessionID值的唯一方法是从cookie中获取,这对于恶意站点来说无法读取或确定。请问我是否遗漏了什么?
2个回答

7
这种方法是正确的。您需要确保通过GET操作可用的所有操作都是“安全的”(这是最佳实践),因为您仅将XSRF保护应用于POST。如果需要额外的保险,您也可以在GET上使用它(通过向所有链接添加URL参数,并在每个GET请求中进行检查),但这很麻烦。如果您特别偏执,可以选择另一个随机数作为替代ID。即使浏览器错误地将会话cookie提供给其他站点上的某些恶意Javascript,这也可以保护您。创建会话时,请选择另一个大的随机数并将其存储在会话中。

我暂时不会担心GET请求,因为在HTTP中使用它们改变状态是无效的(但显然可能)。只要我们保持这个约定/标准,我们应该没问题。我可能会考虑使用你提到的除了SessionID以外的其他值来增加安全性 - 谢谢。 - ironsam

5
理想情况下,您希望使用与会话ID不同的其他内容,但基本上就是这样。 OWASP建议使用存储在用户会话中的随机表单元素名称。 这样,攻击者甚至无法伪造正确的隐藏字段。

http://www.owasp.org/index.php/Top_10_2007-A5#Protection


随机化表单元素名称是一个有趣的想法。感谢提供链接。 - ironsam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接