2009-08-24 6 views
16

Ich habe eine .NET Webforms-Site, die ich an meine MVC-Anwendung senden muss, die sich derzeit in der Webform-Site als separate Anwendung befindet.Generieren von AntiForgeryToken in WebForms

Die Webform-Anwendung muss einige empfindliche Werte an die MVC-Anwendung senden.

Gibt es eine Möglichkeit, ein AntiForgeryToken() in meiner WebForms-Anwendung zu generieren, damit es mit dem Formularpost übergeben werden kann.

Sonst weiß jemand von anderen benutzerdefinierten Anti-Fälschungs-Code, der mir erlauben wird, etwas Ähnliches wie die AntiForgeryValidation des MVC zu tun.

Antwort

8

Die Implementierung selbst ist nicht allzu schwierig.

  • Generieren einen GUID
  • Legen Sie es in einem versteckten Feld
  • es auch in Session oder Cookie setzen (im letzteren Fall mit einigem Anti-Tamper-Schutz)
  • Zu Beginn der von der Verarbeitung Formular vergleichen Sie das Feld und das gespeicherte Token.

(Wenn Sie bei der Implementierung von MVC aussehen, gibt es sehr wenig ist. Ein paar Helfer Methoden ist alles, was Sie benötigen.)

+1

alle Codes zu zeigen, wie dies zu tun? –

+2

@ShekharPankaj Siehe [OWASP .NET Sicherheits-Spickzettel] (https://www.owasp.org/index.php/.NET_Security_Cheat_Sheet#ASP.NET_Web_Forms_Guidance). Vergewissere dich, dass du es vor der Integration verstanden hast (d. H. Was es schützt und vor allem, vor was es dich nicht schützt) (http://security.stackexchange.com/q/59470)). – tne

2

WebForms hat eine ziemlich ähnlich analog in Page.ViewStateUserKey. Nach setting that to a per-user value (die meisten wählen HttpSessionState.SessionId), überprüft WebForms den ViewState als Teil von the MAC check.

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

Es gibt Szenarien, in denen ViewStateUserKey will not help. Hauptsächlich führen sie gefährliche Sachen mit GET-Anfragen (oder in PageLoad, ohne IsPostback zu überprüfen) durch oder deaktivieren ViewStateMAC.

1

Sie können Reflection verwenden, um die MVC-Methoden zu ermitteln, die zum Festlegen der Cookie- und übereinstimmenden Formulareingabe für die MVC-Überprüfung verwendet werden. Auf diese Weise können Sie eine MVC-Aktion mit [AcceptVerbs(HttpVerbs.Post), ValidateAntiForgeryToken]-Attributen ausführen, die Sie auf einer von WebForms generierten Seite veröffentlichen können.

Siehe diese Antwort: Using an MVC HtmlHelper from a WebForm

7

Dies ist eine alte Frage, aber die neueste Visual Studio 2012 ASP.NET Vorlage für Formulare Web enthält anti CSRF-Code in der Seite Master gebacken. Wenn Sie nicht die Vorlagen haben, hier ist der Code erzeugt es:

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

Ausgezeichneter Beitrag, aber Sie haben 3 Zeilen verpasst, in denen 'AntiXsrfTokenKey' und' AntiXsrfUserNameKey' und '_antiXsrfTokenValue' deklariert sind. Könnte nützlich sein, um für einige zu aktualisieren :-) – EvilDr

+0

@IanIppolito Wird dieser Code Anforderungen validiert, die direkt an Handler sind?Weil ich denke, dass dieser Code nicht ausgeführt wird. –

+0

Hallo Sir, ich benutze VS2013 und .Net FrameWork 4.5, um meine ASP.net Webformular App zu erstellen, aber meine Masterseite enthält diesen automatisch generierten Code nicht, woher weiß ich, ob meine Site sicher vor CSRF ist? –

3

Die C# Version von Ian Ippolito Antwort hier:

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

Ist es notwendig, mit der Benutzeridentität aus dem Kontext zu validieren? Der Ansichtszustand verbleibt im Zustand dieser Seite, während der Kontext zwischen den Seiten fortgesetzt wird. Wenn sich die Identität (durch das Durchsuchen mit mehreren Registerkarten) bis zur Ausführung der Überprüfung ändert, wird eine Ausnahme ausgelöst, da ViewState nicht geändert wurde. – Tristan