在哪里存储 CSRF 令牌 - ViewState 或 Session?

Where to store CSRF token - ViewState or Session?

我一直在研究 CSRF 漏洞以及如何在 .NET 应用程序中修复它。

根据我的研究,这里是我需要做的伪算法:

  1. 检查请求 cookie 中的 CSRF 令牌请求,如果不存在,则创建一个 在服务器上。
  2. 创建令牌后,将令牌添加到 响应 cookie 发送回客户端。客户端发送此 CSRF 所有未来请求 cookie 的令牌。
  3. 当服务器收到一个请求并且它 看到 CSRF cookie,服务器根据其存储的 CSRF 进行验证 令牌值。
  4. 匹配时,一切照常,如果值 不匹配则停止请求。

我的问题在第 3 步,我正在使用 ASP .NET 网络表单;我可以将此 CSRF 令牌存储在 Session 或 ViewState 中。

我不想使用 ViewState,因为我们应用程序中的所有页面都必须支持 EnableViewState="true"。否则,每次 post-back 调用都会清除 ViewState 内容。

这种情况下可以使用Session吗?如果我使用 Session 而不是 ViewState,是否会影响修复?

所以您要使用 Synchronizer token pattern (STP) 技术,每个用户会话使用一个令牌。

使用 ASP .NET 会话存储来保存 CSRF 令牌没有问题,基于攻击者无法访问它的简单假设,这不会以任何方式损害您的解决方案。尽管如此,正如 , using cookies to send the CSRF token to the server is flawed, embed the token in an HTML form instead, or use the Cookie-to-header token 技术中所指出的那样。

也就是说,我建议您看一下 AntiForgery Class,它具有内置的令牌生成、HTML 嵌入和验证方法。在安全方面,实施您自己的解决方案绝不是一个好主意,而是寻求成熟的、可信赖的解决方案。

还要确保使用 HTTPS 以防止您的令牌在 Sniffing attack

中被劫持