La generación de AntiForgeryToken en WebForms

Tengo una .NET Webforms sitio gracias necesidades de publicar en mi Aplicación MVC que en la actualidad se encuentra en el interior del Webform sitio como una aplicación independiente.

El Webform la necesidad de la aplicación para PUBLICAR algunos sensible a los valores de la Aplicación MVC.

Hay una manera de generar un AntiForgeryToken() en mi WebForms Aplicación por lo que puede pasar con la forma de post.

De lo contrario, ¿alguien sabe de algún otro anti de encargo de la falsificación de código que me permita hacer algo similar a la MVC AntiForgeryValidation.

OriginalEl autor Naz | 2009-08-24

5 Kommentare

  1. 9

    La implementación de ti mismo no es demasiado difícil.

    • Generar un GUID
    • La puso en un campo oculto
    • Que también lo pone en la Sesión o Cookie (en el último caso, con un poco de anti-tamper de protección)
    • En el inicio de la tramitación de la forma de comparar el campo y símbolo almacenado.

    (Si os fijáis en la implementación de MVC, hay muy poco más que eso. Un par de métodos de ayuda es todo lo que usted necesita.)

    los códigos para mostrar cómo hacer esto?
    Consulte el OWASP .RED de Seguridad de la Hoja de Trucos. Asegúrese de entender que antes de la integración (es decir, lo que te protege de, y lo que es más importante lo que no lo protege de la).

    OriginalEl autor Richard

  2. 9

    Esta es una vieja cuestión, pero el más reciente de Visual Studio 2012 ASP.NET plantilla para web forms incluye anti CSRF código se cocía en la página principal. 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
    Excelente post, pero perdió 3 líneas donde AntiXsrfTokenKey y AntiXsrfUserNameKey, y _antiXsrfTokenValue es declarado. Podría ser útil para la actualización de algunos 🙂
    Será este código valida las solicitudes que están directa al controlador? Porque en ese tiempo, creo que este código no se ejecutará.
    Hola Sir, estoy usando VS2013 y .Net FrameWork 4.5 para crear mi ASP.net formulario web de la aplicación, pero mi maestro de la página no contenga este código auto generado, ¿cómo puedo saber si mi sitio está a salvo de CSRF ?
    Puede usted proporcionar la versión de C# de este auto genera código ?

    OriginalEl autor Ian Ippolito

  3. 5

    La versión de C# de Ian Hipólito 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)
        {
    
        }
    }
    Es necesario validar con la Identidad del Usuario a partir del Contexto? El estado de vista se mantendrá para el estado de esa página mientras Contexto que pasa entre las páginas. Si el cambio de identidad (por navegar con varias pestañas) por el tiempo que la validación se ejecuta generará una excepción ya que el ViewState no han cambiado.

    OriginalEl autor DavidC

  4. 3

    WebForms tiene una muy similar analógica en Página.ViewStateUserKey. Por configuración de la que a cada valor para el usuario (la mayoría elige HttpSessionState.SessionId), WebForms, se validará el ViewState1 como parte de el MAC de verificación.

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

    1 Hay escenarios donde ViewStateUserKey se no ayuda. Principalmente, se reducen a hacer cosas peligrosas con las solicitudes GET (o en el Page_Load sin comprobar IsPostback), o la desactivación de ViewStateMAC.

    OriginalEl autor Mark Brackett

  5. 1

    Puede utilizar la reflexión para llegar a la MVC métodos utilizados para establecer la cookie, y la coincidencia de entrada de formulario utilizado para el MVC de validación. De esa manera usted puede tener un MVC acción con [AcceptVerbs(HttpVerbs.Post), ValidateAntiForgeryToken] atributos que se pueden enviar desde un WebForms página generada.

    Ver esta respuesta: El uso de un MVC HtmlHelper de un WebForm

    OriginalEl autor Keith

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea