ASP.NET Meminta perlindungan Forgery (XSRF/CSRF) dalam Teras ini

Laman dikemaskini :
Tarikh penciptaan halaman :

Persekitaran

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

Apakah permintaan rentas Laman forgeri?

Permintaan merentas tapak (CSRF/XSRF) adalah untuk mereka yang diproses hanya dalam tapak minat. Serangan ke atas kelemahan yang melakukan proses kemas kini daripada tapak Luaran.

Contohnya, sepatutnya anda mempunyai keupayaan untuk menghantar komen pada laman web. Biasanya, saya fikir anda akan posting dengan memasukkan komen dari laman web ini, Proses hantar ini selalunya digunakan untuk membuang data di URL sasaran.

Oleh itu, jika anda menghantar data yang serupa kepada URL daripada seseorang selain daripada tapak sasaran, Ia melayan yang sama anda diposting.

Jika hanya penyerang akan melakukan ini, ia tidak akan menjadi ancaman. Perkara yang menakutkan tentang CSRF adalah bahawa penyerang boleh membina laman palsu atau membenamkan URL tersembunyi di laman web ini. Di sinilah orang lain secara tidak sengaja mengakses dan menjadi penyerang.

Saya tidak akan pergi ke kedalaman di sini, jadi sila mengetahui lebih lanjut mengenai permintaan silang Laman forgeri.

Core ASP.NET menggabungkan langkah ini ke dalam rangka kerja.

Semak permintaan silang tapak untuk berfungsi

Cuba untuk melihat sama ada proses kemas kini dilakukan daripada tapak atau alat Luaran.

Index. cshtml mencipta borang input yang menghantar teks yang anda masukkan ke pelayan. Kemudian, letakkan data supaya pelayan memaparkan mesej yang telah anda buat untuk padan dengan teks 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>

HomeController.cs bahagian pelayan memproses teks yang dihantar dan output kepada jejak studio visual. Tetapkan teks yang sama untuk ViewData supaya ia boleh dipaparkan kepada pelanggan.

HomeController.cs

public class HomeController : Controller
{
  // 省略

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

  // 省略
}

Cuba untuk melaksanakan fungsi yang baru anda cipta dalam langkah biasa. Apabila anda menjalankan penyahpepijatan dan skrin muncul, masukkan teks dan klik butang submit.

Teks yang diproses muncul pada skrin seperti yang dijangka.

Kerana ia juga output kepada jejak, tetingkap output studio visual juga memaparkan teks. Malah, kami melakukan perkara seperti mendaftar data input dalam pangkalan data, tetapi kami tidak akan memudahkan kod di sini.

Sekarang, cuba untuk mengakses program dari luar tapak sasaran semasa debugging dan berjalan. Untuk kesederhanaan, saya akan menghantar pos menggunakan alat yang dipanggil kod Visual Studio. Jika anda boleh menghantar pos, anda boleh menggunakan alat lain atau membina program laman lain untuk serangan.

Apabila anda memasang sambungan yang dipanggil klien rehat dalam Kod studio visual, Anda boleh menggunakan ciri yang membolehkan anda dengan mudah menyemak operasi API rehat hanya dengan membuka fail. http.

Apabila anda mencipta fail. http sama dengan yang berikut dalam fail teks, dan kemudian buka fail dalam Kod studio visual, Anda boleh menghantar GET atau SIARKAN dengan mengklik hantar permintaan.

Jika anda membuat data pos berikut, anda akan dihantar hampir jumlah data yang sama seperti anda menaip teks pada skrin dan tekan butang submit. (Nombor port localhost sepatutnya sama dengan persekitaran pelaksanaan.)

Ujian Rest. 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--

Apabila anda menghantarnya, anda boleh melihat bahawa pelayan sedang menerima teks dan memproses.

Kod studio visual boleh mendapatkan hasilnya. Jika anda melihat dengan lebih dekat kod keputusan, anda boleh melihat bahawa nilai yang ditetapkan untuk ViewData dipaparkan. (Ia dipaparkan dalam Unicode, tetapi teks dipaparkan dengan betul jika dilihat dalam pelayar web.)

Alamat salib-Site permintaan forgeri kelemahan

Seperti yang saya sebutkan pada permulaan, ASP.NET teras menggabungkan langkah-langkah terhadap permintaan silang laman dalam rangka kerja. Satu langkah biasa adalah untuk mengeluarkan token unik kepada pelanggan terlebih dahulu pada skrin yang memerlukan pos, dan sebagainya. Anda tidak perlu menerima pemprosesan melainkan anda membuang token ke pelayan.

Sudah tentu, jika anda mengakses URL secara langsung dari laman Luaran, token itu tidak diketahui dan tidak akan menerima pemprosesan.

Pertama, saya ingin bercakap tentang mengeluarkan token kepada pelanggan (HTML), tetapi Hakikatnya adalah bahawa rangka kerja tidak dapat melakukan ini. Akan pergi. Jika anda menentukan kaedah pos dalam tag borang, anda boleh menggabungkan parameter token ke HTML tanpa kebenaran.

Dalam HTML di bawah, ia adalah nama input = "__RequestVerificationToken" jenis = "tersembunyi". Ini dihantar ke pelayan bersama-sama apabila butang hantar ditekan. Dengan cara ini, ia tidak ditambah dengan kaedah GET.

Di sebelah pelayan, Perkhidmatan Startup.cs. AddControllersWithViews pilihan kaedah. Penapis untuk Autopengesahan Atantiforgerytokenatribut, semua tindakan Semakan token ini secara automatik ditambah kepada (untuk menjadi tepat hanya kaedah HTTP pos, letak, TAMPALAN, dan padam).

Jika anda mahu menambah kekangan ini hanya kepada tindakan tertentu, bukan semua tindakan, setiap pengawal, setiap tindakan Ia juga boleh disetkan.

Sebaliknya, jika anda mahu mengenakan sekatan ke atas kebanyakan tindakan, tetapi anda mahu mengecualikan tindakan tertentu, Jika anda menetapkan atribut IgnoreAntiforgeryToken kepada pengawal dan tindakan, ia 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 bagaimana ia berfungsi. Pertama sekali, proses penghantaran dilakukan dari skrin biasanya.

Keputusan telah ditunjukkan pada skrin seperti yang dijangka.

Ia juga output kepada kesan.

Sekarang, mari kita cuba mengaksesnya dari luar.

Capaian Ed, tetapi permintaan buruk dikembalikan. Ia adalah hasil yang berbeza daripada apabila anda tidak mengambil langkah. Ia difahami bahawa ia dikawal kerana ia tidak output kepada kesan.

Ringkasan

Kali ini saya cuba untuk melaksanakan tindakan terhadap forgeri permintaan merentas laman. Ia sangat mudah untuk dilaksanakan kerana ia telah dibina ke dalam rangka kerja.

Membina laman web memerlukan lebih banyak kelemahan daripada CSRF. Anda boleh menyemak apa yang ada di luar sana, atau anda boleh menggunakan alat seperti OWASP untuk menyemak kelemahan di laman anda.