Fälschungssicherheit

Verhindern von CSRF-Angriffen (Cross-Site Request Forgery) in ASP.NET MVC-Anwendung

Cross-Site Request Forgery (CSRF) ist ein Angriff, bei dem eine böswillige Website eine Anfrage an eine anfällige Website sendet, bei der der Benutzer derzeit angemeldet ist

. Hier ist ein Beispiel für einen CSRF-Angriff:

  1. Ein Benutzer meldet sich mit Formularauthentifizierung an.

  2. Der Server authentifiziert den Benutzer.

  3. Ohne sich abzumelden, besucht der Benutzer eine bösartige Website. Diese bösartige Website enthält das folgende HTML-Formular:

    Beachten Sie, dass die Formularaktion an die anfällige Website und nicht an die bösartige Website gesendet wird. Dies ist der "standortübergreifende" Teil von CSRF.

  4. Der Benutzer klickt auf die Schaltfläche "Senden".

  5. Die Anforderung wird auf dem Server mit dem Authentifizierungskontext des Benutzers ausgeführt und kann alles tun, was ein Authentifizierter Benutzer darf dies tun.

Obwohl der Benutzer in diesem Beispiel auf die Formularschaltfläche klicken muss, könnte die bösartige Seite genauso gut ein Skript ausführen, das das Formular automatisch sendet. Darüber hinaus verhindert die Verwendung von SSL einen CSRF-Angriff nicht, da die bösartige Website eine "https://"-Anfrage senden kann.

Beispielsweise sind z. B. auch die Standard- und Digestauthentifizierung anfällig. Nachdem sich ein Benutzer mit der Standard- oder Digestauthentifizierung angemeldet hat. Der Browser sendet die Anmeldeinformationen automatisch, bis die Sitzung beendet wird.

Anti-Forgery-Token

Um CSRF-Angriffe zu verhindern, verwendet ASP.NET MVC Anti-Forgery-Token, die auch als Anforderungsüberprüfungstoken bezeichnet werden.

  1. Der Client fordert eine HTML-Seite an, die ein Formular enthält.
  2. Der Server enthält zwei Token in der Antwort. Der andere wird in einem ausgeblendeten Formularfeld platziert. Die Token werden nach dem Zufallsprinzip generiert so dass ein Angreifer die Werte nicht erraten kann.
  3. Wenn der Client das Formular sendet, muss er beide Token an den Server zurücksenden. (Ein Browser-Client führt dies automatisch aus, wenn der Benutzer das Formular absendet.)
  4. Wenn eine Anforderung nicht beide Token enthält, lässt der Server die Anforderung nicht zu.

Hier ist ein Beispiel für ein HTML-Formular mit einem ausgeblendeten Formulartoken:

Anti-Forgery-Token funktionieren, da die bösartige Seite die Token des Benutzers aufgrund von Richtlinien gleichen Ursprungs nicht lesen kann. (Richtlinien für denselben Ursprung verhindern, dass Dokumente, die auf zwei verschiedenen Websites gehostet werden, auf den Inhalt der jeweils anderen Website zugreifen. Im vorherigen Beispiel kann die bösartige Seite also Anforderungen an example.com senden, aber die Antwort nicht lesen.)

Um CSRF-Angriffe zu verhindern, verwenden Sie Anti-Forgery-Token mit einem Authentifizierungsprotokoll, bei dem der Browser nach der Anmeldung des Benutzers im Hintergrund Anmeldeinformationen sendet.

Sie sollten benötigen Anti-Forgery-Token für alle nicht sicheren Methoden (POST, PUT, DELETE). Stellen Sie außerdem sicher, dass sichere Methoden (GET, HEAD) keine Nebenwirkungen haben. Wenn Sie außerdem domänenübergreifende Unterstützung wie CORS oder JSONP aktivieren, sind selbst sichere Methoden wie GET potenziell anfällig für CSRF-Angriffe, die es dem Angreifer ermöglichen, potenziell sensible Daten zu lesen.

Fälschungsschutztoken in ASP.NET MVC

Verwenden Sie zum Hinzufügen von Fälschungsschutztoken zu einer Razor-Seite die HtmlHelper.AntiForgeryToken-Hilfsmethode:

Anti-CSRF und AJAX

Das Formulartoken kann für AJAX-Anforderungen ein Problem darstellen, da eine AJAX-Anforderung möglicherweise JSON-Daten und keine HTML-Formulardaten sendet. Eine Lösung besteht darin, die Token in einem benutzerdefinierten HTTP-Header zu senden. Im folgenden Code wird die Razor-Syntax verwendet, um die Token zu generieren, und dann die Token einer AJAX-Anforderung hinzugefügt. Die Token werden auf dem Server durch Aufrufen von AntiForgery.GetTokens .

Wenn Sie die Anforderung verarbeiten, extrahieren Sie die Token aus dem Anforderungsheader. Rufen Sie dann die AntiForgery.Validate-Methode auf, um die Token zu überprüfen. Die Validate-Methode löst eine Ausnahme aus, wenn die Token ungültig sind.