ASP.NET Bescherming van verzoekvervalsing (XSRF/CSRF) in deze kern

Pagina bijgewerkt :
Aanmaakdatum van pagina :

Milieu

Visual Studio
  • Visual Studio 2019
ASP.NET Kern
  • 3.0
  • 3.1

Wat is cross-site aanvraag forgeri?

Cross-site request forgery (CSRF/XSRF) is voor degenen die alleen worden verwerkt binnen de site van belang. Een aanval op een beveiligingslek dat een dergelijk updateproces van een externe site uitvoert.

Stel dat u opmerkingen op een website plaatsen. Normaal gesproken, ik denk dat je post door het invoeren van een reactie van de site, Dit verzendproces wordt meestal gebruikt om gegevens naar de doel-URL te gooien.

Als u daarom vergelijkbare gegevens naar de URL verzendt van iemand anders dan de doelsite, Het is dezelfde traktatie die je gepost hebt.

Als alleen een aanvaller dit zou doen, zou het geen bedreiging zijn. Het enge ding over CSRF is dat aanvallers nep sites kunnen bouwen of verborgen URL's insluiten in de site. Het is waar iemand anders onbedoeld toegang tot het en wordt een aanvaller.

Ik zal hier niet in de diepte gaan, dus kom meer te weten over cross-site verzoek forgeri.

ASP.NET Core neemt deze tegenmaatregel op in het kader.

Controleer cross-site verzoek vervalsing om te werken

Probeer te zien of het updateproces daadwerkelijk wordt uitgevoerd vanuit externe sites of hulpprogramma's.

Index.cshtml maakt een invoerformulier dat de tekst die u hebt ingevoerd naar de server verzendt. Plaats vervolgens viewdata zodat de server berichten weergeeft die u hebt gemaakt om overeen te komen met de invoertekst.

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>

Serverzijde HomeController.cs verwerkt de verzonden tekst en brengt deze uit naar een Visual Studio-tracering. Stel dezelfde tekst in op ViewData, zodat deze aan de client kan worden weergegeven.

HomeController.cs

public class HomeController : Controller
{
  // 省略

  [HttpPost]
  public IActionResult Index(string text)
  {
    System.Diagnostics.Trace.WriteLine($"「{text}」が入力されました。");
    ViewData["Message"] = $"「{text}」が入力されました。";
    return View();
  }

  // 省略
}

Probeer de functionaliteit uit te voeren die u zojuist in de normale stappen hebt gemaakt. Wanneer u foutopsporing uitvoert en het scherm wordt weergegeven, voert u de tekst in en klikt u op Verzenden.

De verwerkte tekst verschijnt zoals verwacht op het scherm.

Omdat het ook wordt uitgevoerd naar het spoor, geeft het uitvoervenster van de visual studio ook tekst weer. In feite doen we dingen zoals het registreren van invoergegevens in een database, maar we gaan de code hier niet vereenvoudigen.

Probeer nu toegang te krijgen tot het programma van buiten de doelsite tijdens het debuggen en uitvoeren. Voor de eenvoud, zal ik na een post met behulp van een tool genaamd Visual Studio Code. Als u POST verzenden, u andere hulpmiddelen gebruiken of een ander plaatsprogramma voor de aanval bouwen.

Wanneer u een extensie met de naam REST-client installeert in Visual Studio Code, U een functie gebruiken waarmee u eenvoudig de werking van de REST API controleren door het .http-bestand te openen.

Wanneer u een .http-bestand maakt dat vergelijkbaar is met het volgende in een tekstbestand en het bestand opent in Visual Studio Code, U GET of POST verzenden door op verzendverzoek te klikken.

Als u de volgende POST-gegevens maakt, ontvangt u bijna dezelfde hoeveelheid gegevens als u tekst op het scherm typt en drukt u op verzenden. (Het nummer van de localhostpoort moet hetzelfde zijn als de uitvoeringsomgeving.)

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--

Wanneer u deze verzendt, u zien dat de server tekst ontvangt en verwerkt.

Visual Studio Code kan de resultaten krijgen. Als u de resultaatcode nader bekijkt, u zien dat de waardeset voor ViewData wordt weergegeven. (Het wordt weergegeven in Unicode, maar de tekst wordt correct weergegeven als deze wordt weergegeven in een webbrowser.)

Adres cross-site aanvraag forgeri kwetsbaarheid

Zoals ik in het begin al zei, neemt ASP.NET Core maatregelen tegen cross-site verzoekvervalsing in het kader. Een veelvoorkomende maatregel is om vooraf een uniek token aan de klant uit te geven op een scherm dat post vereist, enz. U hoeft geen verwerking te accepteren, tenzij u het token naar de server gooit.

Natuurlijk, als u rechtstreeks vanaf een externe site toegang hebt tot de URL, is het token onbekend en accepteert het geen verwerking.

Ten eerste wil ik praten over het uitgeven van tokens aan de client (HTML), maar het feit is dat het framework dit niet kan doen. Zal gaan. Als u een POST-methode opgeeft in de formuliertag, u tokenparameters zonder toestemming in HTML opnemen.

In de HTML hieronder is het de invoernaam="__RequestVerificationToken" type="verborgen". Dit wordt samen naar de server verzonden wanneer de verzendknop wordt ingedrukt. By the way, het is niet toegevoegd door de GET-methode.

Aan de serverkant Startup.cs services. Opties voor de methode AddControllersWithViews. Filters naar AutoValidateAntiforgeryTokenAttribute, alle acties Deze tokencontrole wordt automatisch toegevoegd aan (om precies te zijn alleen de HTTP-methoden van POST, PUT, PATCH en Delete).

Als u deze beperking alleen wilt toevoegen aan specifieke acties, niet alle acties per controller, per actie Het is ook mogelijk om in te stellen.

Als u daarentegen beperkingen wilt opleggen aan de meeste acties, maar u specifieke acties wilt uitsluiten, Als u het kenmerk IgnoreAntiforgeryToken instelt op de controller en actie, is dit 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());
  });
}

Laten we eens kijken hoe het werkt. Allereerst wordt het transmissieproces normaal gedaan vanaf het scherm.

De resultaten werden zoals verwacht op het scherm weergegeven.

Het is ook output aan het spoor.

Laten we proberen er van buitenaf toegang toe te krijgen.

Toegang, maar Bad Request is teruggestuurd. Het is een ander resultaat dan wanneer je geen maatregelen neemt. Het is duidelijk dat het wordt bewaakt omdat het niet output aan het spoor is.

Samenvatting

Deze keer heb ik geprobeerd om maatregelen tegen cross-site verzoek forgeri uit te voeren. Het was zeer eenvoudig te implementeren omdat het al was ingebouwd in het kader.

Het bouwen van een website vereist veel meer kwetsbaarheid dan CSRF. U controleren wat er is, of u tools zoals OWASP gebruiken om te controleren op kwetsbaarheden in uw site.