ASP.NET-Anforderungsfälschungsschutz (XSRF/CSRF) in diesem Kern
Umgebung
- Visual Studio
-
- Visual Studio 2019
- ASP.NET Core
-
- 3.0
- 3.1
Was ist siteübergreifende Anforderungsfälschung?
Standortübergreifende Anforderungsfälschung (CSRF/XSRF) ist für solche, die nur innerhalb des Sehenswürdigkeiten verarbeitet werden. Ein Angriff auf eine Sicherheitsanfälligkeit, die einen solchen Aktualisierungsprozess von einer externen Site aus ausführt.
Angenommen, Sie haben die Möglichkeit, Kommentare auf einer Website zu posten. Normalerweise denke ich, dass Sie posten, indem Sie einen Kommentar von der Website, Dieser Sendevorgang wird am häufigsten verwendet, um Daten an die Ziel-URL zu senden.
Wenn Sie also ähnliche Daten von einer anderen Person als der Zielwebsite an die URL senden, Es ist der gleiche Leckerbissen, den Sie gepostet haben.
Wenn nur ein Angreifer dies tun würde, wäre dies keine Bedrohung. Das Beängstigende an CSRF ist, dass Angreifer gefälschte Websites erstellen oder versteckte URLs in die Website einbetten können. Hier greift jemand anderes unbeabsichtigt darauf zu und wird zum Angreifer.
Ich werde hier nicht in die Tiefe gehen, also erfahren Sie mehr über cross-site request forgeri.
ASP.NET Core integriert diese Gegenmaßnahme in den Rahmen.
Überprüfen Sie die standortübergreifende Anforderungsfälschung, um zu funktionieren
Versuchen Sie, zu sehen, ob der Aktualisierungsvorgang tatsächlich von externen Websites oder Tools durchgeführt wird.
Index.cshtml erstellt ein Eingabeformular, das den eingegebenen Text an den Server sendet. Platzieren Sie dann viewdata, damit der Server Nachrichten anzeigt, die Sie erstellt haben, um dem Eingabetext zu entsprechen.
Index.cshtml
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
<form method="post">
<input type="text" name="text" />
<button type="submit">送信</button>
</form>
<p>@ViewData["Message"]</p>
Serverseitige HomeController.cs verarbeitet den gesendeten Text und gibt ihn in einer Visual Studio-Ablaufverfolgung aus. Legen Sie denselben Text auf ViewData fest, damit er dem Client angezeigt werden kann.
HomeController.cs
public class HomeController : Controller
{
// 省略
[HttpPost]
public IActionResult Index(string text)
{
System.Diagnostics.Trace.WriteLine($"「{text}」が入力されました。");
ViewData["Message"] = $"「{text}」が入力されました。";
return View();
}
// 省略
}
Versuchen Sie, die Funktionalität auszuführen, die Sie gerade in den normalen Schritten erstellt haben. Wenn Sie das Debuggen ausführen und der Bildschirm angezeigt wird, geben Sie den Text ein und klicken Sie auf die Schaltfläche Senden.
Der verarbeitete Text wird wie erwartet auf dem Bildschirm angezeigt.
Da es auch für die Ablaufverfolgung ausgegeben wird, zeigt das visuelle Studioausgabefenster auch Text an. In der Tat tun wir Dinge wie das Registrieren von Eingabedaten in einer Datenbank, aber wir werden den Code hier nicht vereinfachen.
Versuchen Sie nun, während des Debuggens und Ausführens von außerhalb der Zielwebsite auf das Programm zuzugreifen. Der Einfachheit halber poste ich einen Beitrag mit einem Tool namens Visual Studio Code. Wenn Sie POST senden können, können Sie andere Tools verwenden oder ein anderes Websiteprogramm für den Angriff erstellen.
Wenn Sie eine Erweiterung namens REST Client in Visual Studio Code installieren, Sie können eine Funktion verwenden, mit der Sie den Betrieb der REST-API einfach überprüfen können, indem Sie einfach die .http-Datei öffnen.
Wenn Sie eine HTTP-Datei ähnlich der folgenden in einer Textdatei erstellen und dann die Datei in Visual Studio Code öffnen, Sie können GET oder POST senden, indem Sie auf Anforderung senden klicken.
Wenn Sie die folgenden POST-Daten erstellen, werden Ihnen fast die gleiche Datenmenge gesendet, die Sie auf dem Bildschirm eingeben und die Schaltfläche Senden drücken. (Die Lokale Host-Portnummer sollte mit der Ausführungsumgebung identisch sein.)
RestTest.http://www.restTest.http
### Form で POST 送信
POST https://localhost:44372/home/index HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="text"
なんらかのテキスト
------WebKitFormBoundary7MA4YWxkTrZu0gW--
Wenn Sie es senden, können Sie sehen, dass der Server Text empfängt und verarbeitet.
Visual Studio Code kann die Ergebnisse abrufen. Wenn Sie sich den Ergebniscode genauer ansehen, sehen Sie, dass der für ViewData festgelegte Wert angezeigt wird. (Es wird in Unicode angezeigt, aber der Text wird korrekt angezeigt, wenn er in einem Webbrowser angezeigt wird.)
Sicherheitsanfälligkeit bezüglich siteübergreifender Forgeri-Anfragen adressieren
Wie ich eingangs erwähnte, enthält ASP.NET Core Maßnahmen gegen standortübergreifende Anforderungsfälschung in den Rahmen. Eine allgemeine Maßnahme besteht darin, dem Client im Voraus ein eindeutiges Token auf einem Bildschirm ausstellen zu können, der Post usw. erfordert. Sie müssen die Verarbeitung nur akzeptieren, wenn Sie das Token an den Server senden.
Wenn Sie direkt von einer externen Website auf die URL zugreifen, ist das Token natürlich unbekannt und akzeptiert keine Verarbeitung.
Zuerst möchte ich über die Ausgabe von Token an den Client (HTML) sprechen, aber Tatsache ist, dass das Framework nicht in der Lage ist, dies zu tun. Wird gehen. Wenn Sie eine POST-Methode im Formulartag angeben, können Sie Tokenparameter ohne Berechtigung in HTML integrieren.
Im html unten ist es der Eingabename="__RequestVerificationToken" type="hidden". Dies wird zusammen an den Server gesendet, wenn die Sendetaste gedrückt wird. Übrigens wird es nicht von der GET-Methode angehängt.
Auf der Serverseite Startup.cs Dienste. AddControllersWithViews-Methodenoptionen. Filter, um AutoValidateAntiforgeryTokenAttribute, alle Aktionen Diese Tokenprüfung wird automatisch hinzugefügt (um genau zu sein, dass nur die HTTP-Methoden VON POST, PUT, PATCH und DELETE verwendet werden).
Wenn Sie diese Einschränkung nur bestimmten Aktionen hinzufügen möchten, nicht alle Aktionen pro Controller, pro Aktion Es ist auch möglich, zu setzen.
Umgekehrt, wenn Sie Einschränkungen für die meisten Aktionen auferlegen möchten, aber bestimmte Aktionen ausschließen möchten, Wenn Sie das IgnoreAntiforgeryToken-Attribut auf den Controller und die Aktion festlegen, ist es OK.
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews(options =>
{
// 全ての「POST, PUT, PATCH, DELETE」アクションに自動で ValidateAntiForgeryToken を付与。
// 個別に除外したい場合は「IgnoreAntiforgeryToken」属性を指定すること
// API では HTML 側にトークンを発行できないのでコントローラーに「IgnoreAntiforgeryToken」を指定する必要がある。
options.Filters.Add(new Microsoft.AspNetCore.Mvc.AutoValidateAntiforgeryTokenAttribute());
});
}
Mal sehen, wie es funktioniert. Zuallererst erfolgt der Übertragungsvorgang normal vom Bildschirm aus.
Die Ergebnisse wurden wie erwartet auf dem Bildschirm reflektiert.
Es wird auch in die Spur ausgegeben.
Lassen Sie uns nun versuchen, von außen darauf zuzugreifen.
Zugriff ed, aber Bad Request wurde zurückgegeben. Es ist ein anderes Ergebnis als wenn Sie keine Maßnahmen ergreifen. Es versteht sich, dass es bewacht wird, weil es nicht auf die Spur ausgegeben wird.
Zusammenfassung
Dieses Mal habe ich versucht, Maßnahmen gegen standortübergreifende Anforderungsforgeri umzusetzen. Es war sehr einfach zu implementieren, da es bereits in den Rahmen eingebaut war.
Das Erstellen einer Website erfordert viel mehr Sicherheitsanfälligkeit als CSRF. Sie können überprüfen, was da draußen ist, oder Sie können Tools wie OWASP verwenden, um nach Schwachstellen in Ihrer Website zu suchen.