No soy un desarrollador .NET y estoy tratando de entender cómo protege exactamente __ViewState contra los ataques CSRF / XSRF.
Encontré lo siguiente:
security Debate de intercambio de pila sobre un tema similar y Guía OWASP para la protección de CSRF
Estoy un poco confundido con cómo exactamente está sucediendo aquí la protección CSRF. Si observamos el siguiente código tomado del enlace OWASP mencionado anteriormente:
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;
}
Por lo que puedo entender, el código anterior verifica si hay una cookie llamada '__AntiXsrfToken', ya presente.
Si no, se genera un nuevo valor aleatorio, que se asigna a ViewStateUserKey y también se establece como el valor de la cookie, '__AntiXsrfToken'.
Si la cookie ya está presente, el valor de la cookie simplemente se toma y se asigna a ViewStateUserKey.
Ahora, lo que no entiendo es que el punto principal de un token antiXSRF es que no debe ser detectable y, por lo tanto, no debe transmitirse en las cookies, ya que las cookies siempre serán enviadas con cada solicitud por el navegador. En el caso anterior, dado que el token AntiXsrf se está utilizando como cookies, ¿cómo lo protege? ¿Cuál es realmente el uso de ViewStateUserKey y cómo desempeña un papel en la protección contra XSRF aquí?