2009-08-24 6 views
16

J'ai un site .NET Webforms Merci de poster sur mon application MVC qui se trouve actuellement dans le site Webform en tant qu'application séparée.Génération de AntiForgeryToken dans WebForms

L'application Webform doit POST certaines valeurs sensibles à l'application MVC.

Y a-t-il un moyen de générer un AntiForgeryToken() dans mon application WebForms afin qu'il puisse être passé avec le post du formulaire. Sinon, quelqu'un connaît-il un autre code anti-falsification personnalisé qui me permettra de faire quelque chose de similaire à AntiForgeryValidation du MVC?

Répondre

8

La mise en œuvre vous-même n'est pas trop difficile.

  • Générer un GUID
  • Mettez dans un champ caché
  • mettre également en session ou un cookie (dans ce dernier cas, avec une certaine protection anti-effraction)
  • Au début du traitement de la formulaire compare le champ et le jeton stocké.

(Si vous regardez la mise en œuvre de MVC, il y a très peu plus à elle. Quelques méthodes d'aide est tout ce dont vous avez besoin.)

+1

des codes pour montrer comment faire cela? –

+2

@ShekharPankaj Voir la [Fiche de sécurité OWASP .NET] (https://www.owasp.org/index.php/.NET_Security_Cheat_Sheet#ASP.NET_Web_Forms_Guidance). Assurez-vous de bien le comprendre avant de l'intégrer (c'est-à-dire de quoi il vous protège, et plus important encore [de quoi il ne vous protège pas) (http://security.stackexchange.com/q/59470)). – tne

2

WebForms a un analogue assez similaire dans Page.ViewStateUserKey. Par setting that to a per-user value (la plupart choisissent HttpSessionState.SessionId), WebForms validera le ViewState dans le cadre de the MAC check.

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

Il existe des scénarios où ViewStateUserKey will not help. Principalement, ils se résument à faire des choses dangereuses avec des requêtes GET (ou dans Page_Load sans vérifier IsPostback), ou désactiver ViewStateMAC.

1

Vous pouvez utiliser la réflexion pour obtenir les méthodes MVC utilisées pour définir le cookie et l'entrée de formulaire correspondante utilisée pour la validation MVC. De cette façon, vous pouvez avoir une action MVC avec des attributs [AcceptVerbs(HttpVerbs.Post), ValidateAntiForgeryToken] que vous pouvez publier à partir d'une page générée par WebForms.

Voir cette réponse: Using an MVC HtmlHelper from a WebForm

7

Ceci est une question ancienne, mais le dernier Visual Studio 2012 modèle ASP.NET pour les formulaires Web inclut code anti CSRF cuit au four dans la page principale. Si vous ne disposez pas des modèles, voici le code qu'il génère:

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

Excellent post, mais vous avez manqué 3 lignes où 'AntiXsrfTokenKey' et' AntiXsrfUserNameKey', et '_antiXsrfTokenValue' est déclaré. Peut-être utile de mettre à jour pour certains :-) – EvilDr

+0

@IanIppolito Ce code va-t-il valider les requêtes directement au gestionnaire?Parce qu'à ce moment je pense que ce code ne sera pas exécuté. –

+0

Bonjour Monsieur, j'utilise VS2013 et .Net FrameWork 4.5 pour créer mon application web ASP.net, mais ma page maître ne contient pas ce code généré automatiquement, comment puis-je savoir si mon site est sûr de CSRF? –

3

La version C# de réponse Ian Ippolito ici:

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

Est-il nécessaire de valider avec l'identité de l'utilisateur à partir du contexte? L'état d'affichage reste à l'état de cette page pendant que le contexte se poursuit entre les pages. Si l'identité change (en naviguant avec plusieurs onglets) au moment où la validation est exécutée, elle lèvera une exception car ViewState n'aura pas changé. – Tristan

Questions connexes