ASP.NET Perlindungan Pemalsuan Permintaan (XSRF/CSRF) dalam Inti Ini

Halaman Diperbarui :
Tanggal pembuatan halaman :

Lingkungan

Studio visual
  • Visual Studio 2019
ASP.NET inti
  • 3,0
  • 3,1

Apa Cross-situs permintaan forgeri?

Cross-Site request pemalsuan (CSRF/xsrf) adalah bagi mereka yang diproses hanya dalam situs yang diminati. Serangan terhadap kerentanan yang melakukan proses Pemutakhiran tersebut dari situs eksternal.

Sebagai contoh, misalkan Anda memiliki kemampuan untuk memposting komentar di situs web. Biasanya, saya pikir Anda akan posting dengan memasukkan komentar dari situs, Proses Kirim ini paling sering digunakan untuk membuang data di URL target.

Oleh karena itu, jika Anda mengirim data yang sama ke URL dari orang lain selain situs target, Ini memperlakukan yang sama Anda diposting.

Jika hanya seorang penyerang akan melakukan hal ini, itu tidak akan menjadi ancaman. Hal yang menakutkan tentang CSRF adalah bahwa penyerang dapat membangun situs palsu atau menanamkan URL tersembunyi di situs. Di sinilah orang lain secara tidak sengaja mengaksesnya dan menjadi penyerang.

Aku tidak akan pergi ke kedalaman di sini, jadi silakan Cari tahu lebih lanjut tentang Cross-situs permintaan forgeri.

ASP.NET Core menggabungkan penanggulangan ini ke dalam kerangka kerja.

Periksa permintaan lintas-situs pemalsuan untuk bekerja

Cobalah untuk melihat apakah proses pembaruan sebenarnya dilakukan dari situs eksternal atau alat.

Index. cshtml membuat form input yang mengirim teks yang Anda masukkan ke server. Kemudian menempatkan viewdata sehingga server menampilkan pesan yang telah Anda buat untuk mencocokkan teks input.

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

Server-side HomeController.cs memproses teks terkirim dan output ke jejak Visual Studio. Atur teks yang sama ke ViewData sehingga dapat ditampilkan kepada klien.

HomeController.cs

public class HomeController : Controller
{
  // 省略

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

  // 省略
}

Cobalah untuk melakukan fungsi yang baru saja Anda buat di langkah normal. Ketika Anda menjalankan debugging dan layar muncul, masukkan teks dan klik tombol kirim.

Teks diproses muncul di layar seperti yang diharapkan.

Karena itu juga output ke jejak, jendela output Visual Studio juga menampilkan teks. Bahkan, kita melakukan hal seperti mendaftarkan data input dalam database, tapi kita tidak akan menyederhanakan kode di sini.

Sekarang, cobalah untuk mengakses program dari luar situs target saat debugging dan berjalan. Untuk kesederhanaan, saya akan memposting posting menggunakan alat yang disebut Visual Studio Code. Jika Anda dapat mengirim POST, Anda dapat menggunakan alat lain atau membangun program situs lain untuk menyerang.

Ketika Anda menginstal ekstensi yang disebut klien Rest dalam Visual Studio kode, Anda dapat menggunakan fitur yang memungkinkan Anda dengan mudah memeriksa pengoperasian REST API hanya dengan membuka file. http.

Ketika Anda membuat berkas. http yang serupa dengan berikut ini di berkas teks, dan kemudian Buka berkas di Visual Studio kode, Anda dapat mengirim GET atau POST dengan mengklik Kirim permintaan.

Jika Anda membuat data POST berikut, Anda akan dikirim hampir jumlah data yang sama saat Anda mengetikkan teks pada layar dan tekan tombol submit. (Nomor port localhost harus sama dengan lingkungan eksekusi.)

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

Ketika Anda mengirimkannya, Anda dapat melihat bahwa server menerima teks dan memprosesnya.

Visual Studio code bisa mendapatkan hasilnya. Jika Anda melihat lebih dekat pada kode hasil, Anda dapat melihat bahwa nilai yang ditetapkan untuk ViewData ditampilkan. (Ditampilkan dalam Unicode, tetapi teks ditampilkan dengan benar jika dilihat di browser web.)

Alamat Cross-site permintaan forgeri kerentanan

Seperti yang saya sebutkan di awal, ASP.NET Core menggabungkan tindakan terhadap permintaan Cross-Site pemalsuan dalam kerangka. Ukuran umum adalah mengeluarkan token unik ke klien terlebih dahulu di layar yang memerlukan pos, dll. Anda tidak harus menerima pemrosesan kecuali Anda membuang token ke server.

Tentu saja, jika Anda mengakses URL langsung dari situs eksternal, Token tidak diketahui dan tidak akan menerima pemrosesan.

Pertama, saya ingin berbicara tentang mengeluarkan token untuk klien (HTML), tetapi faktanya adalah bahwa kerangka tidak mampu melakukan hal ini. Akan pergi. Jika Anda menentukan metode POST dalam tag formulir, Anda dapat menggabungkan parameter token ke HTML tanpa izin.

Dalam HTML di bawah ini, itu adalah nama input = "__RequestVerificationToken" type = "Hidden". Ini dikirim ke server bersama-sama ketika tombol Kirim ditekan. Omong-omong, tidak ditambahkan oleh metode GET.

Di sisi server, Layanan Startup.cs. Opsi metode AddControllersWithViews. Filter untuk Autovalidateantiforgerytokenattribute, semua tindakan Pemeriksaan token ini secara otomatis ditambahkan ke (tepatnya hanya metode HTTP POST, PUT, PATCH, dan DELETE).

Jika Anda ingin menambahkan kendala ini hanya untuk tindakan tertentu, tidak semua tindakan, per kontroler, per tindakan Hal ini juga memungkinkan untuk mengatur.

Sebaliknya, jika Anda ingin memberlakukan pembatasan pada sebagian besar tindakan, namun Anda ingin mengecualikan tindakan tertentu, Jika Anda menetapkan atribut Ignoreantiforgerytoken pengontrol dan tindakan, itu adalah 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());
  });
}

Mari kita lihat cara kerjanya. Pertama-tama, proses transmisi dilakukan dari layar normal.

Hasilnya tercermin pada layar seperti yang diharapkan.

Hal ini juga output ke jejak.

Sekarang, mari kita coba untuk mengaksesnya dari luar.

Akses Ed, tapi Bad request dikembalikan. Ini adalah hasil yang berbeda dari ketika Anda tidak mengambil tindakan. Hal ini dipahami bahwa itu dijaga karena tidak output ke jejak.

Ringkasan

Kali ini saya mencoba untuk melaksanakan tindakan terhadap lintas-situs permintaan forgeri. Itu sangat mudah diimplementasikan karena sudah dibangun ke dalam kerangka kerja.

Membangun situs web memerlukan lebih banyak kerentanan daripada CSRF. Anda dapat memeriksa apa yang ada di luar sana, atau Anda dapat menggunakan alat seperti OWASP untuk memeriksa kerentanan di situs Anda.