我不是 .NET 开发人员,我想了解 __ViewState 究竟是如何防止 CSRF/XSRF 攻击的。
我遇到了以下情况:
关于类似主题的安全堆栈交换讨论和 OWASP CSRF 保护指南
我对这里的 CSRF 保护到底是如何发生的有点困惑。如果我们看一下从上面提到的 OWASP 链接中获取的以下代码:
private const string AntiXsrfTokenKey = "__AntiXsrfToken";
private const string AntiXsrfUserNameKey = "__AntiXsrfUserName";
private string _antiXsrfTokenValue;
protected void Page_Init(object sender, EventArgs e)
{
// The code below helps to protect against XSRF attacks
var requestCookie = Request.Cookies[AntiXsrfTokenKey];
Guid requestCookieGuidValue;
if (requestCookie != null && Guid.TryParse(requestCookie.Value, out requestCookieGuidValue))
{
// Use the Anti-XSRF token from the cookie
_antiXsrfTokenValue = requestCookie.Value;
Page.ViewStateUserKey = _antiXsrfTokenValue;
}
else
{
// Generate a new Anti-XSRF token and save to the cookie
_antiXsrfTokenValue = Guid.NewGuid().ToString("N");
Page.ViewStateUserKey = _antiXsrfTokenValue;
var responseCookie = new HttpCookie(AntiXsrfTokenKey)
{
HttpOnly = true,
Value = _antiXsrfTokenValue
};
if (FormsAuthentication.RequireSSL && Request.IsSecureConnection)
{
responseCookie.Secure = true;
}
Response.Cookies.Set(responseCookie);
}
Page.PreLoad += master_Page_PreLoad;
}
据我了解,上面的代码检查是否已经存在名为“__AntiXsrfToken”的cookie。
如果不是,则生成一个新的随机值,将其分配给 ViewStateUserKey 并设置为 cookie 的值“__AntiXsrfToken”。
如果 cookie 已经存在,则简单地获取 cookie 的值并将其分配给 ViewStateUserKey。
现在我不明白的是,关于 antiXSRF 令牌的全部意义在于它不应该被猜测,当然也不应该在 cookie 中传递,因为 cookie 总是会随浏览器的每个请求一起发送。在上述情况下,由于 AntiXsrf 令牌被用作 cookie,它如何防止它?ViewStateUserKey 的真正用途是什么?它如何在此处对 XSRF 的保护发挥作用?