为什么存在 csrf 令牌时 aspnet 会阻止浏览器页面缓存?
Why is aspnet preventing browser page caching when a csrf token is present?
如 here 所述,使用 asp.net 生成 csrf 令牌也将阻止响应被浏览器缓存。
Generates an AntiforgeryTokenSet for this request and stores the cookie token in the response. This operation also sets the "Cache-control" and "Pragma" headers to "no-cache" and the "X-Frame-Options" header to "SAMEORIGIN".
我最初假设做出此决定是为了防止用户使用浏览器的“后退”按钮提交“过时”的请求令牌。后来我注意到这可能不是原因,因为 :
- asp.net 为整个 session.
保留相同的 cookie 标记
- asp.net 允许多次提交相同的请求令牌,只要 cookie 令牌不变即可。
因此,根据我目前的理解,使用浏览器后退按钮并提交缓存的 html 页面应该没有问题?
当浏览器页面缓存包含 csrf 令牌时,禁用浏览器页面缓存的理由是什么?这是安全最佳实践吗?
编辑
正如@serpent5 正确指出的那样,header Cache-Control: no-store
确保 public 缓存不会缓存响应并将其提供给不同的用户。澄清一下,我更感兴趣的是启用浏览器缓存 (Cache-Control: private
) 是否会对安全性产生负面影响。
您已经很好地描述了 ASP.NET
中的防伪保护设置。
此外,我在下面包含了官方文档的一些部分。
要记住的主要事情是生成了一组令牌,这些令牌进入会话 cookie 和隐藏的表单标签,并且只有存在该确切组合才能通过安全检查。
当会话过期时,会生成新的令牌。
现在不能允许私有缓存的原因与过期时间有关。
万一网页的缓存持续时间超过反 XSRF 会话的到期时间,用户最终会得到来自缓存的 previous/old 令牌,因为该令牌正在被重用。
提交该网页时,服务器端安全检查将失败,以防新会话启动(直到页面缓存失效)。
由于反 XSRF cookie 是会话 cookie,它们会在关闭网络浏览器时被删除。在后续请求中,将启动新会话并生成新令牌。相应的仍然有效的缓存网页的存在将立即导致上述安全检查失败的情况。
XSRF/CSRF Prevention in ASP.NET MVC and Web Pages
文档中的一些引用
The ASP.NET Web Stack Runtime uses a variant of the synchronizer token
pattern to defend against XSRF attacks. The general form of the
synchronizer token pattern is that two anti-XSRF tokens are submitted
to the server with each HTTP POST (In addition to the authentication
token): one token as a cookie, and the other as a form value.
In per-session token implementation after initial generation of token,
the value is stored in the session and is used for each subsequent
request until the session expires.
When the tokens are submitted, the server will allow the request to
proceed only if both tokens pass a comparison check.
If a new anti-XSRF token was generated in step (1), a new session
token will be created to contain it and will be added to the outbound
HTTP cookies collection. The field token from step (2) will be wrapped
in an <input type="hidden" />
element.
如 here 所述,使用 asp.net 生成 csrf 令牌也将阻止响应被浏览器缓存。
Generates an AntiforgeryTokenSet for this request and stores the cookie token in the response. This operation also sets the "Cache-control" and "Pragma" headers to "no-cache" and the "X-Frame-Options" header to "SAMEORIGIN".
我最初假设做出此决定是为了防止用户使用浏览器的“后退”按钮提交“过时”的请求令牌。后来我注意到这可能不是原因,因为 :
- asp.net 为整个 session. 保留相同的 cookie 标记
- asp.net 允许多次提交相同的请求令牌,只要 cookie 令牌不变即可。
因此,根据我目前的理解,使用浏览器后退按钮并提交缓存的 html 页面应该没有问题?
当浏览器页面缓存包含 csrf 令牌时,禁用浏览器页面缓存的理由是什么?这是安全最佳实践吗?
编辑
正如@serpent5 正确指出的那样,header Cache-Control: no-store
确保 public 缓存不会缓存响应并将其提供给不同的用户。澄清一下,我更感兴趣的是启用浏览器缓存 (Cache-Control: private
) 是否会对安全性产生负面影响。
您已经很好地描述了 ASP.NET
中的防伪保护设置。
此外,我在下面包含了官方文档的一些部分。
要记住的主要事情是生成了一组令牌,这些令牌进入会话 cookie 和隐藏的表单标签,并且只有存在该确切组合才能通过安全检查。
当会话过期时,会生成新的令牌。
现在不能允许私有缓存的原因与过期时间有关。
万一网页的缓存持续时间超过反 XSRF 会话的到期时间,用户最终会得到来自缓存的 previous/old 令牌,因为该令牌正在被重用。 提交该网页时,服务器端安全检查将失败,以防新会话启动(直到页面缓存失效)。
由于反 XSRF cookie 是会话 cookie,它们会在关闭网络浏览器时被删除。在后续请求中,将启动新会话并生成新令牌。相应的仍然有效的缓存网页的存在将立即导致上述安全检查失败的情况。
XSRF/CSRF Prevention in ASP.NET MVC and Web Pages
文档中的一些引用The ASP.NET Web Stack Runtime uses a variant of the synchronizer token pattern to defend against XSRF attacks. The general form of the synchronizer token pattern is that two anti-XSRF tokens are submitted to the server with each HTTP POST (In addition to the authentication token): one token as a cookie, and the other as a form value.
In per-session token implementation after initial generation of token, the value is stored in the session and is used for each subsequent request until the session expires.
When the tokens are submitted, the server will allow the request to proceed only if both tokens pass a comparison check.
If a new anti-XSRF token was generated in step (1), a new session token will be created to contain it and will be added to the outbound HTTP cookies collection. The field token from step (2) will be wrapped in an
<input type="hidden" />
element.