ASP.NET pieprasījuma viltošanas (XSRF/CSRF) aizsardzību šajā kodolā

Lapa atjaunota :
Lapas izveides datums :

Vides

Visual Studio
  • Visual Studio 2019
ASP.NET Core
  • 3,0
  • 3,1

Kas ir starpvietņu pieprasījuma forgeri?

Starpvietņu pieprasījuma viltošana (CSRF/XSRF) ir paredzēta tiem, kas tiek apstrādāti tikai interesējošās vietas ietvaros. Uzbrukumu ievainojamību, kas veic šādu atjaunināšanas procesu no ārējās vietas.

Piemēram, pieņemsim, ka jums ir iespēja ievietot komentārus vietnē. Parasti es domāju, ka jūs post ievadot komentāru no vietas, Šis sūtīšanas process visbiežāk tiek izmantots, lai izmestu datus mērķa vietrādī URL.

Tāpēc, ja nosūtāt līdzīgus datus uz vietrādi URL no kāda, kas nav mērķa vietne, Tas pats ārstēt jums ievietojis.

Ja tikai uzbrucējs varētu darīt, tas nebūtu drauds. Scary lieta par CSRF ir tas, ka uzbrucēji var veidot viltotas vietnes vai iegult slēptās URL vietā. Tas ir, ja kāds cits nejauši piekļūst to un kļūst par uzbrucēju.

Es ne iedziļināties dziļums šeit, tāpēc, lūdzu, uzzināt vairāk par starpvietņu pieprasījuma forgeri.

ASP.NET Core šo pretpasākumu iekļauj sistēmā.

Pārbaudiet Starpvietu pieprasījuma viltošanu, lai strādātu

Mēģiniet skatīt, vai atjaunināšanas process faktiski tiek veikts no ārējām vietnēm vai rīkiem.

Index. cshtml izveido ievades veidlapu, kas sūta serverī ievadīto tekstu. Pēc tam novietojiet viewdata, lai serveris parādītu ziņojumus, kurus esat izveidojis, lai tie atbilstu ievades tekstam.

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>

Servera puses HomeController.cs apstrādā nosūtīto tekstu un izvadi to Visual Studio trasēšanas. Iestatiet to pašu tekstu ViewData, lai to varētu parādīt klientam.

HomeController.cs

public class HomeController : Controller
{
  // 省略

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

  // 省略
}

Mēģiniet veikt funkcionalitāti, kuru tikko izveidojāt parastos soļos. Izpildot atkļūdošanu un parādās ekrāns, ievadiet tekstu un noklikšķiniet uz pogas iesniegt.

Apstrādātā teksta parādās ekrānā, kā paredzēts.

Jo tas ir arī izvades trasēšanas Visual Studio izvades logs arī parāda tekstu. Patiesībā, mēs lietas, piemēram, reģistrējot ievades datus datu bāzē, bet mēs nebrauksim, lai vienkāršotu kodu šeit.

Tagad, mēģiniet piekļūt programmu no ārpus mērķa vietā, bet debugging un darbojas. Vienkāršības labad, i ' ll post post izmantojot rīku, ko sauc par Visual Studio Code. Ja varat nosūtīt pastu, varat izmantot citus rīkus vai izveidot citu vietu programmu uzbrukumu.

Instalējot paplašinājumu sauc Rest klienta Visual Studio kodu, Varat izmantot funkciju, kas ļauj ērti pārbaudīt REST API darbību, tikai atverot. http failu.

Veidojot. http failu, kas līdzīgs šim teksta failā un pēc tam atveriet failu Visual Studio kodu, Varat nosūtīt iegūt vai GRĀMATOT, noklikšķinot uz Sūtīt pieprasījumu.

Ja izveidojat šādus ziņu datus, jums tiks nosūtīts gandrīz tāds pats datu apjoms, rakstot tekstu ekrānā, un nospiediet iesniegšanas pogu. (Localhost porta numuram jābūt tādam pašam kā izpildes videi.)

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

To nosūtot, var redzēt, ka serveris saņem tekstu un apstrādā to.

Visual Studio kods var iegūt rezultātus. Ja vēlaties aplūkot rezultātu kodu tuvāk, varat redzēt, ka tiek rādīta ViewData iestatīto vērtību vērtība. (Tas tiek parādīts unikoda, bet teksts tiek parādīts pareizi, ja tiek skatīts Web pārlūkprogrammā.)

Adrese vairākvietņu pieprasījuma forgeri ievainojamību

Kā jau minēju sākumā, ASP.NET Core ietver pasākumus pret vairākvietu pieprasījumu viltošanu šajā sistēmā. Kopīgs pasākums ir izsniegt unikālu simbolisku klientam iepriekš uz ekrāna, kas prasa pastu, uc Jums nav jāpieņem apstrāde, ja vien jūs mest pilnvara uz serveri.

Protams, ja jūs piekļūstat URL tieši no ārējās vietas, pilnvara nav zināma un nepieņems apstrādi.

Pirmkārt, es gribētu runāt par izsniegšanu žetoniem, lai klients (HTML), bet fakts ir tas, ka sistēma nav spējīgs to izdarīt. Dosies. Ja veidlapas tagā norādāt POST metodi, bez atļaujas varat iekļaut token parametrus HTML formātā.

Zemāk HTML, tas ir ievades nosaukums = "__RequestVerificationToken" type = "slēptās". Tā tiek nosūtīta uz serveri kopā, kad tiek nospiesta poga nosūtīt. Starp citu, tas nav pievienots GET metodi.

Servera pusē Startup.cs pakalpojumi. AddControllersWithViews metodes opcijas. Filtrus, lai Autovalidateantiforgerytokenattribute, visas darbības Šī pilnvara pārbaude tiek automātiski pievienota (precīzi tikai HTTP metodes pastu, IELIECIET, IELĀPU un dzēst).

Ja vēlaties šo ierobežojumu pievienot tikai noteiktām darbībām, ne visām darbībām, vienam kontrolierim katrai darbībai Ir iespējams arī iestatīt.

Savukārt, ja vēlaties uzlikt ierobežojumus lielākajai daļai darbību, bet vēlaties izslēgt noteiktas darbības, Iestatot Ignoreantiforgerytoken atribūtu kontrolieris un darbību, tas ir 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());
  });
}

Let ' s redzēt, kā tā darbojas. Pirmkārt, pārvades process tiek veikts no ekrāna normāli.

Rezultāti tika atspoguļoti ekrānā, kā paredzēts.

Tas arī izvadīt uz pēdām.

Tagad mēģināsim piekļūt no ārpuses.

Piekļuve ED, bet sliktu pieprasījumu tika atgriezta. Tas ir atšķirīgs rezultāts nekā tad, ja jūs neuzņematies pasākumus. Ir saprotams, ka tas ir apsargāta, jo tas nav izeja uz pēdām.

Kopsavilkuma

Šoreiz es centos īstenot pasākumus pret starpvietņu pieprasījuma forgeri. Tas bija ļoti viegli īstenot, jo tas jau bija iebūvēts sistēmā.

Building Web site prasa daudz vairāk neaizsargātību nekā CSRF. Varat pārbaudīt, kas tur ir, vai varat izmantot rīkus, piemēram, OWASP, lai pārbaudītu ievainojamību jūsu vietnē.