2009-08-24 17 views
16

Tengo un sitio .NET Webforms gracias a las necesidades de publicar en mi aplicación MVC que actualmente se encuentra dentro del sitio Webform como una aplicación separada.Generación de AntiForgeryToken en WebForms

La aplicación Webform necesita ENVIAR algunos valores confidenciales a la aplicación MVC.

Existe una forma de generar un AntiForgeryToken() en mi aplicación WebForms para que se pueda pasar con la publicación del formulario.

De lo contrario, alguien sabe de cualquier otro código anti falsificación personalizado que me permita hacer algo similar a AntiForgeryValidation MVC.

Respuesta

8

Implementarlo usted mismo no es demasiado difícil.

  • generar un GUID
  • Póngalo en un campo oculto
  • tambien ponerla en sesión o Cookie (en este último caso, con algún tipo de protección antisabotaje)
  • Al inicio de la tramitación de la forma comparar el campo y el token almacenado.

(Si nos fijamos en la aplicación del MVC, hay muy poco más que eso. Unos métodos de ayuda es todo lo que necesita.)

+1

cualquier código para mostrar cómo hacer esto? –

+2

@ShekharPankaj Consulte la [Hoja de seguridad de OWASP .NET] (https://www.owasp.org/index.php/.NET_Security_Cheat_Sheet#ASP.NET_Web_Forms_Guidance). Asegúrese de comprenderlo antes de integrarlo (es decir, de qué lo protege y, lo que es más importante, de [lo que no lo protege]) (http://security.stackexchange.com/q/59470)). – tne

2

WebForms tiene un análogo bastante similar en Page.ViewStateUserKey. Por setting that to a per-user value (la mayoría elige HttpSessionState.SessionId), WebForms validará ViewState como parte de the MAC check.

overrides OnInit(EventArgs e) { 
    base.OnInit(e); 
    ViewStateUserKey = Session.SessionId; 
} 

hay escenarios donde ViewStateUserKey will not help. Principalmente, se reducen a hacer cosas peligrosas con las solicitudes GET (o en Page_Load sin verificar IsPostback) o al deshabilitar ViewStateMAC.

1

Puede utilizar la reflexión para obtener los métodos MVC utilizados para establecer la cookie y la entrada de formulario coincidente utilizada para la validación de MVC. De esta forma, puede tener una acción MVC con los atributos [AcceptVerbs(HttpVerbs.Post), ValidateAntiForgeryToken] que puede publicar en una página generada por WebForms.

Ver esta respuesta: Using an MVC HtmlHelper from a WebForm

7

Ésta es una vieja pregunta, pero la plantilla ASP.NET reciente de Visual Studio 2012 para formularios web incluye anticódigo CSRF al horno en la página maestra. Si usted no tiene las plantillas, aquí está el código que genera:

Protected Sub Page_Init(sender As Object, e As System.EventArgs) 


    ' The code below helps to protect against XSRF attacks 
    Dim requestCookie As HttpCookie = Request.Cookies(AntiXsrfTokenKey) 
    Dim requestCookieGuidValue As Guid 
    If ((Not requestCookie Is Nothing) AndAlso Guid.TryParse(requestCookie.Value, requestCookieGuidValue)) Then 
     ' 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 

     Dim responseCookie As HttpCookie = New HttpCookie(AntiXsrfTokenKey) With {.HttpOnly = True, .Value = _antiXsrfTokenValue} 
     If (FormsAuthentication.RequireSSL And Request.IsSecureConnection) Then 
      responseCookie.Secure = True 
     End If 
     Response.Cookies.Set(responseCookie) 
    End If 

    AddHandler Page.PreLoad, AddressOf master_Page_PreLoad 
End Sub 

Private Sub master_Page_PreLoad(sender As Object, e As System.EventArgs) 


    If (Not IsPostBack) Then 
     ' Set Anti-XSRF token 
     ViewState(AntiXsrfTokenKey) = Page.ViewStateUserKey 
     ViewState(AntiXsrfUserNameKey) = If(Context.User.Identity.Name, String.Empty) 
    Else 
     ' Validate the Anti-XSRF token 
     If (Not DirectCast(ViewState(AntiXsrfTokenKey), String) = _antiXsrfTokenValue _ 
      Or Not DirectCast(ViewState(AntiXsrfUserNameKey), String) = If(Context.User.Identity.Name, String.Empty)) Then 
      Throw New InvalidOperationException("Validation of Anti-XSRF token failed.") 
     End If 
    End If 
End Sub 
+1

Excelente publicación, pero omitió 3 líneas donde 'AntiXsrfTokenKey' y' AntiXsrfUserNameKey', y '_antiXsrfTokenValue' se declaran. Podría ser útil actualizar para algunos :-) – EvilDr

+0

@IanIppolito ¿Este código valida las solicitudes que son directas al controlador?Porque en ese momento creo que este código no se ejecutará. –

+0

Hola, señor, estoy usando VS2013 y .Net FrameWork 4.5 para crear mi aplicación de formulario web ASP.net, pero mi página maestra no contiene este código generado automáticamente, ¿cómo sé si mi sitio está a salvo de CSRF? –

3

El C# versión de Ian Ippolito respuesta aquí:

public partial class SiteMaster : MasterPage 
{ 
    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; 
    } 

    protected void master_Page_PreLoad(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      // Set Anti-XSRF token 
      ViewState[AntiXsrfTokenKey] = Page.ViewStateUserKey; 
      ViewState[AntiXsrfUserNameKey] = Context.User.Identity.Name ?? String.Empty; 
     } 
     else 
     { 
      // Validate the Anti-XSRF token 
      if ((string)ViewState[AntiXsrfTokenKey] != _antiXsrfTokenValue 
       || (string)ViewState[AntiXsrfUserNameKey] != (Context.User.Identity.Name ?? String.Empty)) 
      { 
       throw new InvalidOperationException("Validation of Anti-XSRF token failed."); 
      } 
     } 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 
} 
+0

¿Es necesario validar con la identidad del usuario del contexto? El estado de la vista permanecerá en el estado de esa página mientras el contexto continúe entre las páginas. Si el cambio de identidad (mediante la exploración con varias pestañas) para el momento en que se ejecuta la validación arrojará una excepción ya que ViewState no habrá cambiado. – Tristan