2009-08-24 6 views
16

Mam witrynę internetową .NET Webforms, dzięki której muszę opublikować moją aplikację MVC, która obecnie znajduje się w witrynie Webform jako osobna aplikacja.Generowanie AntiForgeryToken w WebForms

Aplikacja Webform wymaga podania pewnych czułych wartości do aplikacji MVC.

Czy istnieje sposób generowania AntiForgeryToken() w mojej aplikacji WebForms, aby można było przekazywać ją za pomocą formularza.

W przeciwnym razie ktoś wie o jakimkolwiek innym niestandardowym kodzie fałszowania, który pozwoli mi zrobić coś podobnego do AntiForgeryValidation MVC.

Odpowiedz

8

Wdrażanie go samemu nie jest trudne.

  • Generowanie GUID
  • Umieścić go w ukrytym polu
  • także umieścić go w sesji lub cookies (w tym ostatnim przypadku, z jakimś anty-sabotażu ochrony)
  • Na początku przeróbki formularz porównać pole i zapisany token.

(Jeśli spojrzeć na realizacji MVC, istnieje bardzo niewiele więcej. Kilka metod pomocniczych jest wszystko, czego potrzebujemy.)

+1

jakieś kody, aby pokazać, jak to zrobić? –

+2

@ShekharPankaj Zobacz [OWASP .NET Security Cheat Sheet] (https://www.owasp.org/index.php/.NET_Security_Cheat_Sheet#ASP.NET_Web_Forms_Guidance). Upewnij się, że rozumiesz go przed integracją (tj. Przed tym, co chroni przed nim, a co ważniejsze [przed tym, czego on nie chroni] (http://security.stackexchange.com/q/59470)). – tne

2

WebForms ma dość podobny analogowe Page.ViewStateUserKey. Do setting that to a per-user value (najczęściej wybierany jest HttpSessionState.SessionId), WebFormy sprawdzają ViewState jako część the MAC check.

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

Istnieją sytuacje, w których ViewStateUserKey will not help. Głównie sprowadzają się do robienia niebezpiecznych rzeczy za pomocą żądań GET (lub w Page_Load bez sprawdzania IsPostback) lub wyłączając ViewStateMAC.

1

Możesz użyć odbicia, aby uzyskać metody MVC używane do ustawiania cookie i pasujące dane wejściowe używane do sprawdzania poprawności MVC. W ten sposób możesz wykonać akcję MVC z atrybutami [AcceptVerbs(HttpVerbs.Post), ValidateAntiForgeryToken], które możesz publikować na stronie wygenerowanej przez WebForms.

Zobacz tę odpowiedź: Using an MVC HtmlHelper from a WebForm

7

jest to stara sprawa, ale ASP.NET szablon do formularzy internetowych najnowsze Visual Studio 2012 zawiera anty kod CSRF pieczony na stronie wzorcowej. Jeśli nie masz szablony, oto kod generuje:

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

Doskonały post, ale pominąłeś 3 linie, w których zadeklarowano 'AntiXsrfTokenKey' i' AntiXsrfUserNameKey' oraz '_antiXsrfTokenValue'. Może być przydatna do aktualizacji dla niektórych :-) – EvilDr

+0

@IanIppolito Czy ten kod potwierdzi żądania skierowane bezpośrednio do obsługi?Ponieważ w tym czasie myślę, że ten kod nie zostanie wykonany. –

+0

Witam Panie, używam VS2013 i .Net FrameWork 4.5 do tworzenia mojej aplikacji internetowej ASP.net, ale moja strona wzorcowa nie zawiera tego generowanego automatycznie kodu, skąd mam wiedzieć, czy moja witryna jest bezpieczna od CSRF? –

3

C# wersja Ian Ippolito odpowiedź tutaj:

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

Czy konieczne jest potwierdzenie tożsamości użytkownika z kontekstu? Stan widoku pozostanie niezmieniony do stanu tej strony, podczas gdy Kontekst przechodzi pomiędzy stronami. Jeśli tożsamość zmieni się (przeglądając wiele kart) przed uruchomieniem sprawdzania poprawności, zostanie zgłoszony wyjątek, ponieważ parametr Stan widoku nie zostanie zmieniony. – Tristan