ValidateAntiForgeryToken Zweck, Erklärung und Beispiel


310

Könnten Sie den Zweck von ValidateAntiForgeryToken erläutern und mir ein Beispiel ValidateAntiForgeryTokenin MVC 4 zeigen?

Ich konnte keine Beispiele finden, die dieses Attribut erklären.


8
Überprüfen Sie diesen Beitrag Prideparrot.com/blog/archive/2012/7/…
VJAI

1
Übrigens verstehe ich wirklich nicht, warum MS es nicht möglich gemacht hat, dies direkt in den .BeginFormHelfer zu integrieren. Also dieses Ding ist automatisch da, wie in Rails
Jazzcat

Antworten:


350

Die Anti-Fälschungs-Unterstützung von MVC schreibt einen eindeutigen Wert in ein Nur-HTTP-Cookie, und dann wird derselbe Wert in das Formular geschrieben. Wenn die Seite gesendet wird, wird ein Fehler ausgegeben, wenn der Cookie-Wert nicht mit dem Formularwert übereinstimmt.

Es ist wichtig zu beachten, dass die Funktion Fälschungen von standortübergreifenden Anforderungen verhindert . Dies ist ein Formular von einer anderen Site, das auf Ihrer Site veröffentlicht wird, um versteckte Inhalte mit den Anmeldeinformationen eines authentifizierten Benutzers zu übermitteln. Der Angriff besteht darin, den angemeldeten Benutzer zum Senden eines Formulars zu verleiten oder einfach programmgesteuert ein Formular auszulösen, wenn die Seite geladen wird.

Die Funktion verhindert keine andere Art von Datenfälschung oder manipulationsbasierten Angriffen.

Um es zu verwenden, dekorieren Sie die Aktionsmethode oder den Controller mit dem ValidateAntiForgeryTokenAttribut und rufen Sie @Html.AntiForgeryToken()in den Formularen auf, die an die Methode gesendet werden.


5
@ Chris Es ist beides. Gemäß meiner Antwort: "Schreibt einen eindeutigen Wert in ein Nur-HTTP-Cookie und dann wird der gleiche Wert in das Formular geschrieben "
Richard Szalay,

21
Warum ist dies nicht standardmäßig festgelegt?
Christian Hagelid

12
@Christian, weil es nicht Ruby on Rails ist. ;-)
Martin Capodici

6
Es scheint, dass das Formular __RequestVerificationToken und das Cookie __RequestVerificationToken nicht identisch sind, sondern als Paar funktionieren.
WaiKit Kung

5
@rdans CORS und CSRF sind überhaupt nicht unterschiedlich. Mit CORS können andere Domänen auf APIs auf Ihrem Server zugreifen. Bei CSRF wird sichergestellt, dass ein Formularbeitrag von der Seite stammt, die Sie erwartet haben.
Richard Szalay

52

Der Hauptzweck des ValidateAntiForgeryToken-Attributs besteht darin, standortübergreifende Fälschungsangriffe zu verhindern.

Eine standortübergreifende Anforderungsfälschung ist ein Angriff, bei dem ein schädliches Skriptelement, ein böswilliger Befehl oder Code vom Browser eines vertrauenswürdigen Benutzers gesendet wird. Weitere Informationen hierzu finden Sie unter http://www.asp.net/mvc/overview/security/xsrfcsrf-prevention-in-aspnet-mvc-and-web-pages .

Es ist einfach zu verwenden. Sie müssen die Methode wie folgt mit dem Attribut ValidateAntiForgeryToken dekorieren:

[HttpPost]  
[ValidateAntiForgeryToken]  
public ActionResult CreateProduct(Product product)  
{
  if (ModelState.IsValid)  
  {
    //your logic 
  }
  return View(ModelName);
}

Es wird vom System.Web.Mvc-Namespace abgeleitet.

Fügen Sie Ihrer Ansicht nach diesen Code hinzu, um das Token hinzuzufügen, damit das Formular bei der Übermittlung überprüft werden kann.

@Html.AntiForgeryToken()

Ja, Sie haben Recht, Sie müssen @ Html.AntiForgeryToken () aus Ihrem Formular aufrufen und das ValidateAntiForgeryTokenAttribute zu der Aktionsmethode hinzufügen, die Sie schützen möchten.
Chandra Malla

Vielen Dank für diese einfach zu verstehende Antwort :)
Noobprogrammer

4

In ASP.Net Core wird das Anti-Fälschungs-Token automatisch zu Formularen hinzugefügt. Sie müssen es also nicht hinzufügen, @Html.AntiForgeryToken()wenn Sie ein Rasiermesser-Formularelement verwenden oder wenn Sie IHtmlHelper.BeginForm verwenden und wenn die Methode des Formulars nicht GET ist.

Es wird ein Eingabeelement für Ihr Formular generiert, das dem folgenden ähnelt: <input name="__RequestVerificationToken" type="hidden" value="CfDJ8HSQ_cdnkvBPo-jales205VCq9ISkg9BilG0VXAiNm3Fl5Lyu_JGpQDA4_CLNvty28w43AL8zjeR86fNALdsR3queTfAogif9ut-Zd-fwo8SAYuT0wmZ5eZUYClvpLfYm4LLIVy6VllbD54UxJ8W6FA">

Und wenn der Benutzer das Formular einreicht, wird dieses Token auf der Serverseite überprüft, wenn die Validierung aktiviert ist.

[ValidateAntiForgeryToken]Attribut kann gegen Aktionen verwendet werden. Anforderungen an Aktionen, auf die dieser Filter angewendet wird, werden blockiert, es sei denn, die Anforderung enthält ein gültiges Antiforgery-Token.

[AutoValidateAntiforgeryToken]Attribut kann gegen Controller verwendet werden. Dieses Attribut funktioniert identisch mit dem Attribut ValidateAntiForgeryToken, außer dass für Anforderungen, die mit den folgenden HTTP-Methoden gestellt werden, keine Token erforderlich sind: GET HEAD OPTIONS TRACE

Zusätzliche Informationen: https://docs.microsoft.com/pl-pl/aspnet/core/security/anti-request-forgery


2

Microsoft bietet uns integrierte Funktionen, die wir aus Sicherheitsgründen in unserer Anwendung verwenden, sodass niemand unsere Website hacken oder in wichtige Informationen eindringen kann.

Aus dem Zweck von ValidateAntiForgeryToken in der MVC-Anwendung von Harpreet Singh:

Verwendung von ValidateAntiForgeryToken

Versuchen wir anhand eines einfachen Beispiels, dieses Konzept zu verstehen. Ich möchte es nicht zu kompliziert machen, deshalb werde ich eine Vorlage einer MVC-Anwendung verwenden, die bereits in Visual Studio verfügbar ist. Wir werden dies Schritt für Schritt tun. Lasst uns beginnen.

  1. Schritt 1 - Erstellen Sie zwei MVC-Anwendungen mit der Standard-Internetvorlage und geben Sie diese Namen als CrossSite_RequestForgery bzw. Attack_Application an.

  2. Öffnen Sie nun die Webkonfiguration der CrossSite_RequestForgery-Anwendung, ändern Sie die Verbindungszeichenfolge durch die unten angegebene und speichern Sie sie.

`

<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=local\SQLEXPRESS;Initial Catalog=CSRF;
Integrated Security=true;" providerName="System.Data.SqlClient" /> 
 </connectionStrings>
  1. Klicken Sie nun auf Extras >> NuGet Package Manager und dann auf Package Manager Console

  2. Führen Sie nun die folgenden drei Befehle in der Package Manager-Konsole aus, um die Datenbank zu erstellen.

Enable-Migrations Add-Migration erste Update-Datenbank

Wichtige Hinweise - Ich habe eine Datenbank mit Code First-Ansatz erstellt, da ich dieses Beispiel so gestalten möchte, wie Entwickler arbeiten. Sie können die Datenbank auch manuell erstellen. Es ist deine Wahl.

  1. Öffnen Sie nun den Account Controller. Hier sehen Sie eine Registermethode, deren Typ post ist. Über dieser Methode sollte ein Attribut als [ValidateAntiForgeryToken] verfügbar sein. Kommentieren Sie dieses Attribut. Klicken Sie nun mit der rechten Maustaste auf Registrieren und gehen Sie zu Anzeigen. Auch hier finden Sie einen HTML-Helfer als @ Html.AntiForgeryToken (). Kommentieren Sie auch diesen. Führen Sie die Anwendung aus und klicken Sie auf die Schaltfläche Registrieren. Die URL wird geöffnet als:

http: // localhost: 52269 / Account / Register

Anmerkungen - Ich weiß jetzt, dass in den Köpfen aller Leser die Frage aufgeworfen wird, warum diese beiden Helfer kommentiert werden müssen, da jeder weiß, dass diese zur Validierung der Anfrage verwendet werden. Dann möchte ich Sie alle wissen lassen, dass dies nur deshalb so ist, weil ich den Unterschied nach und vor dem Anwenden dieser Helfer zeigen möchte.

  1. Öffnen Sie nun die zweite Anwendung, Attack_Application. Öffnen Sie dann die Registrierungsmethode des Account Controllers. Ändern Sie einfach die POST-Methode durch die unten gezeigte einfache.

    Anmeldeformular
    1. @ Html.LabelFor (m => m.UserName) @ Html.TextBoxFor (m => m.UserName)
    2. @ Html.LabelFor (m => m.Password) @ Html.PasswordFor (m => m.Password)
    3. @ Html.LabelFor (m => m.ConfirmPassword) @ Html.PasswordFor (m => m.ConfirmPassword)

7. Angenommen, Sie sind ein Hacker und kennen die URL, unter der Sie Benutzer in der Anwendung CrossSite_RequestForgery registrieren können. Jetzt haben Sie eine Fälschungssite als Attacker_Application erstellt und einfach dieselbe URL in die Post-Methode eingefügt.

8. Führen Sie diese Anwendung jetzt aus, füllen Sie die Registerfelder aus und klicken Sie auf Registrieren. Sie werden sehen, dass Sie in der Anwendung CrossSite_RequestForgery registriert sind. Wenn Sie die Datenbank der Anwendung CrossSite_RequestForgery überprüfen, wird der von Ihnen eingegebene Eintrag angezeigt.

  1. Wichtig - Öffnen Sie jetzt die Anwendung CrossSite_RequestForgery, kommentieren Sie das Token im Account Controller aus und registrieren Sie die Ansicht. Versuchen Sie erneut, sich mit demselben Vorgang zu registrieren. Dann tritt ein Fehler wie unten auf.

Serverfehler in '/' Anwendung. ________________________________________ Das erforderliche Fälschungsschutz-Cookie "__RequestVerificationToken" ist nicht vorhanden.

Das sagt das Konzept. Was wir in View hinzufügen, dh @ Html.AntiForgeryToken (), generiert __RequestVerificationToken beim Laden und [ValidateAntiForgeryToken] für die Controller-Methode. Ordnen Sie diesen Token der Post-Zeit zu. Wenn das Token dasselbe ist, bedeutet dies, dass dies eine gültige Anforderung ist.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.