CA5391: Gunakan token anti-pemalsuan di pengontrol MVC ASP.NET Core
Properti | Nilai |
---|---|
ID Aturan | CA5391 |
Judul | Menggunakan token antiforgery di pengontrol MVC Inti ASP.NET |
Golongan | Keamanan |
Perbaikan bersifat disruptif atau non-disruptif | Non-disruptif |
Diaktifkan secara default di .NET 9 | No |
Penyebab
Tindakan yang menghasilkan memodifikasi operasi tidak memiliki atribut token anti-pemalsuan. Atau, menggunakan filter token anti-pemalsuan global tanpa memanggil fungsi token anti-pemalsuan yang diharapkan.
Deskripsi aturan
Menangani permintaan POST
, PUT
, PATCH
, atau DELETE
tanpa memvalidasi token anti pemalsuan mungkin rentan terhadap serangan pemalsuan permintaan antar situs. Serangan pemalsuan permintaan antar situs dapat mengirim permintaan berbahaya dari pengguna yang diautentikasi ke pengontrol ASP.NET Core MVC Anda.
Cara memperbaiki pelanggaran
- Tandai tindakan modifikasi dengan atribut token antiforgery yang valid:
- Microsoft.AspNetCore.Mvc.ValidateAntiForgeryTokenAttribute.
- Atribut yang namanya seperti
%Validate%Anti_orgery%Attribute
.
- Tambahkan atribut token pemalsuan yang valid ke dalam filter global dengan Microsoft.AspNetCore.Mvc.Filters.FilterCollection.Add.
- Tambahkan kelas filter anti-pemalsuan kustom atau yang disediakan Mvc yang memanggil
Validate
di kelas mana pun yang mengimplementasikan antarmuka Microsoft.AspNetCore.Antiforgery.IAntiforgery.
Kapan harus menekan peringatan
Aman untuk menyembunyikan aturan ini jika solusi selain penggunaan atribut token anti-pemalsuan diadopsi untuk mengurangi kerentanan CSRF. Untuk informasi selengkapnya, lihat Mencegah serangan Pemalsuan Permintaan Antar Situs (XSRF/CSRF) di ASP.NET Core.
Menyembunyikan peringatan
Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.
#pragma warning disable CA5391
// The code that's violating the rule is on this line.
#pragma warning restore CA5391
Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none
dalam file konfigurasi.
[*.{cs,vb}]
dotnet_diagnostic.CA5391.severity = none
Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.
Mengonfigurasi kode yang akan dianalisis
Anda dapat mengonfigurasi apakah aturan hanya berlaku untuk kelas turunan Microsoft.AspNetCore.Mvc.Controller pada codebase Anda. Misalnya, untuk menentukan bahwa aturan tidak boleh dijalankan pada kode apa pun dalam jenis turunan ControllerBase, tambahkan pasangan kunci-nilai berikut ke file .editorconfig di proyek Anda:
dotnet_code_quality.CA5391.exclude_aspnet_core_mvc_controllerbase = true
Contoh kode semu
Tanpa pelanggaran atribut token anti-pemalsuan
using Microsoft.AspNetCore.Mvc;
class ExampleController : Controller
{
[HttpDelete]
public IActionResult ExampleAction (string actionName)
{
return null;
}
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction (string actionName)
{
return null;
}
}
Tanpa filter anti-pemalsuan global yang valid
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
class ExampleController : Controller
{
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction (string actionName)
{
return null;
}
[HttpDelete]
public IActionResult ExampleAction (string actionName)
{
return null;
}
}
class FilterClass : IAsyncAuthorizationFilter
{
public Task OnAuthorizationAsync (AuthorizationFilterContext context)
{
return null;
}
}
class BlahClass
{
public static void BlahMethod ()
{
FilterCollection filterCollection = new FilterCollection ();
filterCollection.Add(typeof(FilterClass));
}
}
Ditandai dengan solusi atribut token anti-pemalsuan
using Microsoft.AspNetCore.Mvc;
class ExampleController : Controller
{
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult ExampleAction ()
{
return null;
}
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction ()
{
return null;
}
}
Menggunakan filter anti-pemalsuan global yang valid
using System.Threading.Tasks;
using Microsoft.AspNetCore.Antiforgery;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
class ExampleController : Controller
{
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction()
{
return null;
}
[HttpDelete]
public IActionResult ExampleAction()
{
return null;
}
}
class FilterClass : IAsyncAuthorizationFilter
{
private readonly IAntiforgery antiforgery;
public FilterClass(IAntiforgery antiforgery)
{
this.antiforgery = antiforgery;
}
public Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
return antiforgery.ValidateRequestAsync(context.HttpContext);
}
}
class BlahClass
{
public static void BlahMethod()
{
FilterCollection filterCollection = new FilterCollection();
filterCollection.Add(typeof(FilterClass));
}
}