ASP.NET request forgery (XSRF/CSRF) in questo core
Ambiente
- Visual Studio
-
- Visual Studio 2019
- ASP.NET Core
-
- 3.0
- 3.1
Che cos'è la forgeri delle richieste intersito?
La contraffazione delle richieste intersito (CSRF/XSRF) è destinata a quelle che vengono elaborate solo all'interno del sito di interesse. Attacco a una vulnerabilità che esegue un processo di aggiornamento da un sito esterno.
Ad esempio, supponiamo di avere la possibilità di pubblicare commenti su un sito web. Normalmente, penso che pubblicherai inserendo un commento dal sito, Questo processo di invio viene spesso utilizzato per generare dati all'URL di destinazione.
Pertanto, se si inviano dati simili all'URL da un utente diverso dal sito di destinazione, È lo stesso piacere che hai postato.
Se solo un utente malintenzionato lo facesse, non sarebbe una minaccia. La cosa spaventosa di CSRF è che gli aggressori possono costruire siti falsi o incorporare URL nascosti nel sito. È dove qualcun altro accede involontariamente e diventa un utente malintenzionato.
Non entrerò in profondità qui, quindi per favore scopridi di più su cross-site request forgeri.
ASP.NET Core incorpora questa contromisura nel framework.
Controllare la contraffazione delle richieste intersito per funzionare
Provare a verificare se il processo di aggiornamento viene effettivamente eseguito da siti o strumenti esterni.
Index.cshtml crea un modulo di input che invia il testo immesso al server. Posizionare quindi i dati della visualizzazione in modo che il server visualizzi i messaggi creati in modo che corrispondano al testo di input.
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>
Il HomeController.cs sul lato server elabora il testo inviato e lo restituisce in una traccia di Visual Studio.Server-side HomeController.cs processes the sent text and outputs to a Visual Studio trace. Impostare lo stesso testo su ViewData in modo che possa essere visualizzato al client.
HomeController.cs
public class HomeController : Controller
{
// 省略
[HttpPost]
public IActionResult Index(string text)
{
System.Diagnostics.Trace.WriteLine($"「{text}」が入力されました。");
ViewData["Message"] = $"「{text}」が入力されました。";
return View();
}
// 省略
}
Provare a eseguire la funzionalità appena creata nei passaggi normali. Quando si esegue il debug e viene visualizzata la schermata, immettere il testo e fare clic sul pulsante Invia.
Il testo elaborato viene visualizzato sullo schermo come previsto.
Poiché è anche l'output per la traccia, la finestra di output di Visual Studio visualizza anche il testo. Infatti, facciamo cose come la registrazione dei dati di input in un database, ma non stiamo andando a semplificare il codice qui.
A questo punto, provare ad accedere al programma dall'esterno del sito di destinazione durante il debug e l'esecuzione. Per semplicità, verrà postare un post utilizzando uno strumento denominato Visual Studio Code.For simplicity, I'll post a post using a tool called Visual Studio Code. Se è possibile inviare POST, è possibile utilizzare altri strumenti o costruire un altro programma del sito per l'attacco.
Quando si installa un'estensione denominata client REST nel codice di Visual Studio, È possibile usare una funzionalità che consente di controllare facilmente il funzionamento dell'API REST semplicemente aprendo il file http.
Quando si crea un file con estensione http simile al seguente in un file di testo e quindi aprire il file in Visual Studio Code, È possibile inviare GET o POST facendo clic su Invia richiesta.
Se si creano i seguenti dati POST, verrà inviata quasi la stessa quantità di dati durante la digitazione del testo sullo schermo e si preme il pulsante di invio. Il numero di porta Localhost deve essere lo stesso dell'ambiente di esecuzione.
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--
Quando lo invii, puoi vedere che il server riceve il testo e lo elabora.
Visual Studio Code può ottenere i risultati. Se si esamina più da vicino il codice del risultato, è possibile vedere che viene visualizzato il valore impostato per ViewData.If you take a closer look at the result code, you can see that the value set for ViewData is displayed. (Viene visualizzato in Unicode, ma il testo viene visualizzato correttamente se visualizzato in un browser Web.)
Affrontare la vulnerabilità della richiesta di informazioni su più siti
Come ho detto all'inizio, ASP.NET Core incorpora misure contro la contraffazione di richieste intersito nel framework. Una misura comune consiste nell'emettere un token univoco al client in anticipo su una schermata che richiede post e così via. Non è necessario accettare l'elaborazione a meno che non si generi il token al server.
Naturalmente, se si accede all'URL direttamente da un sito esterno, il token è sconosciuto e non accetta l'elaborazione.
In primo luogo, vorrei parlare di emissione di token al client (HTML), ma il fatto è che il framework non è in grado di farlo. Andrà. Se si specifica un metodo POST nel tag form, è possibile incorporare parametri token in HTML senza autorizzazione.
Nel codice HTML riportato di seguito, è il nome di input "__RequestVerificationToken" tipo "nascosto". Questo viene inviato al server insieme quando viene premuto il pulsante di invio. A proposito, non viene aggiunto dal metodo GET.
Sul lato server, Startup.cs servizi. Opzioni del metodo AddControllersWithViews.AddControllersWithViews method options. Filtri per AutoValidateAntiforgeryTokenAttribute, tutte le azioni Questo controllo token viene aggiunto automaticamente a (per l'esattezza solo i metodi HTTP di POST, PUT, PATCH e DELETE).
Se si desidera aggiungere questo vincolo solo ad azioni specifiche, non a tutte le azioni, per controller, per azione È anche possibile impostare.
Al contrario, se si desidera imporre restrizioni alla maggior parte delle azioni, ma si desidera escludere azioni specifiche, Se si imposta l'attributo IgnoreAntiforgeryToken sul controller e sull'azione, è 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());
});
}
Vediamo come funziona. Prima di tutto, il processo di trasmissione viene eseguito normalmente dallo schermo.
I risultati sono stati riflessi sullo schermo come previsto.
Viene inoltre restituito alla traccia.
Ora, proviamo ad accedervi dall'esterno.
Access ed, ma è stata restituita una richiesta non valida. È un risultato diverso rispetto a quando non stai prendendo misure. Resta inteso che è custodito perché non viene emesso nella traccia.
Riepilogo
Questa volta ho cercato di implementare misure contro forgeri di richiesta cross-site. E 'stato molto facile da implementare perché era già integrato nel quadro.
La creazione di un sito Web richiede molta più vulnerabilità rispetto a CSRF. Puoi controllare cosa c'è là fuori, oppure puoi utilizzare strumenti come OWASP per verificare la presenza di vulnerabilità nel tuo sito.