在asp.net中,我正在实现一个IHttpModule来缓解CSRF攻击。它会在GET请求中向响应的html中注入一个隐藏的表单参数,该参数包含asp.net SessionID。在POST请求中,它会检查隐藏参数的值是否与当前SessionID匹配。据我所知,获取SessionID值的唯一方法是从cookie中获取,这对于恶意站点来说无法读取或确定。请问我是否遗漏了什么?
这种方法是正确的。您需要确保通过GET操作可用的所有操作都是“安全的”(这是最佳实践),因为您仅将XSRF保护应用于POST。如果需要额外的保险,您也可以在GET上使用它(通过向所有链接添加URL参数,并在每个GET请求中进行检查),但这很麻烦。如果您特别偏执,可以选择另一个随机数作为替代ID。即使浏览器错误地将会话cookie提供给其他站点上的某些恶意Javascript,这也可以保护您。创建会话时,请选择另一个大的随机数并将其存储在会话中。
理想情况下,您希望使用与会话ID不同的其他内容,但基本上就是这样。 OWASP建议使用存储在用户会话中的随机表单元素名称。 这样,攻击者甚至无法伪造正确的隐藏字段。 http://www.owasp.org/index.php/Top_10_2007-A5#Protection