Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Pemalsuan Permintaan Lintas Situs (CSRF) adalah serangan di mana situs berbahaya mengirim permintaan ke situs yang rentan tempat pengguna saat ini masuk
Berikut adalah contoh serangan CSRF:
Pengguna masuk menggunakan
www.example.com
autentikasi formulir.Server mengautentikasi pengguna. Respons dari server menyertakan cookie autentikasi.
Tanpa keluar, pengguna mengunjungi situs web berbahaya. Situs berbahaya ini berisi formulir HTML berikut:
<h1>You Are a Winner!</h1> <form action="http://example.com/api/account" method="post"> <input type="hidden" name="Transaction" value="withdraw" /> <input type="hidden" name="Amount" value="1000000" /> <input type="submit" value="Click Me"/> </form>
Perhatikan bahwa tindakan formulir memposting ke situs yang rentan, bukan ke situs berbahaya. Ini adalah bagian "lintas situs" dari CSRF.
Pengguna mengklik tombol kirim. Browser menyertakan cookie autentikasi dengan permintaan.
Permintaan berjalan di server dengan konteks autentikasi pengguna, dan dapat melakukan apa pun yang diizinkan untuk dilakukan oleh pengguna terautentikasi.
Meskipun contoh ini mengharuskan pengguna untuk mengklik tombol formulir, halaman berbahaya bisa dengan mudah menjalankan skrip yang mengirimkan formulir secara otomatis. Selain itu, menggunakan SSL tidak mencegah serangan CSRF, karena situs berbahaya dapat mengirim permintaan "https://".
Biasanya, serangan CSRF dimungkinkan terhadap situs web yang menggunakan cookie untuk autentikasi, karena browser mengirim semua cookie yang relevan ke situs web tujuan. Namun, serangan CSRF tidak terbatas pada mengeksploitasi cookie. Misalnya, autentikasi Dasar dan Hash juga rentan. Setelah pengguna masuk dengan autentikasi Dasar atau Hash. browser secara otomatis mengirim kredensial hingga sesi berakhir.
Token Anti-Pemalsuan
Untuk membantu mencegah serangan CSRF, ASP.NET MVC menggunakan token anti-pemalsuan, juga disebut token verifikasi permintaan.
- Klien meminta halaman HTML yang berisi formulir.
- Server menyertakan dua token dalam respons. Satu token dikirim sebagai cookie. Yang lain ditempatkan dalam bidang formulir tersembunyi. Token dihasilkan secara acak sehingga setan tidak dapat menebak nilai.
- Ketika klien mengirimkan formulir, klien harus mengirim kedua token kembali ke server. Klien mengirim token cookie sebagai cookie, dan mengirimkan token formulir di dalam data formulir. (Klien browser secara otomatis melakukan ini ketika pengguna mengirimkan formulir.)
- Jika permintaan tidak menyertakan kedua token, server melarang permintaan.
Berikut adalah contoh formulir HTML dengan token formulir tersembunyi:
<form action="/Home/Test" method="post">
<input name="__RequestVerificationToken" type="hidden"
value="6fGBtLZmVBZ59oUad1Fr33BuPxANKY9q3Srr5y[...]" />
<input type="submit" value="Submit" />
</form>
Token anti-pemalsuan berfungsi karena halaman berbahaya tidak dapat membaca token pengguna, karena kebijakan asal yang sama. (Kebijakan asal yang sama mencegah dokumen yang dihosting di dua situs berbeda untuk mengakses konten satu sama lain. Jadi dalam contoh sebelumnya, halaman berbahaya dapat mengirim permintaan ke example.com, tetapi tidak dapat membaca respons.)
Untuk mencegah serangan CSRF, gunakan token anti-pemalsuan dengan protokol autentikasi apa pun di mana browser secara diam-diam mengirim kredensial setelah pengguna masuk. Ini termasuk protokol autentikasi berbasis cookie, seperti autentikasi formulir, serta protokol seperti autentikasi Dasar dan Hash.
Anda harus memerlukan token anti-pemalsuan untuk metode nonsafe apa pun (POST, PUT, DELETE). Selain itu, pastikan bahwa metode aman (GET, HEAD) tidak memiliki efek samping. Selain itu, jika Anda mengaktifkan dukungan lintas domain, seperti CORS atau JSONP, maka bahkan metode aman seperti GET berpotensi rentan terhadap serangan CSRF, memungkinkan penyerang membaca data yang berpotensi sensitif.
Token Anti-Pemalsuan di ASP.NET MVC
Untuk menambahkan token anti-pemalsuan ke halaman Razor, gunakan metode pembantu HtmlHelper.AntiForgeryToken :
@using (Html.BeginForm("Manage", "Account")) {
@Html.AntiForgeryToken()
}
Metode ini menambahkan bidang formulir tersembunyi dan juga mengatur token cookie.
Anti-CSRF dan AJAX
Token formulir dapat menjadi masalah untuk permintaan AJAX, karena permintaan AJAX mungkin mengirim data JSON, bukan data formulir HTML. Salah satu solusinya adalah mengirim token di header HTTP kustom. Kode berikut menggunakan sintaks Razor untuk menghasilkan token, lalu menambahkan token ke permintaan AJAX. Token dihasilkan di server dengan memanggil AntiForgery.GetTokens.
<script>
@functions{
public string TokenHeaderValue()
{
string cookieToken, formToken;
AntiForgery.GetTokens(null, out cookieToken, out formToken);
return cookieToken + ":" + formToken;
}
}
$.ajax("api/values", {
type: "post",
contentType: "application/json",
data: { }, // JSON data goes here
dataType: "json",
headers: {
'RequestVerificationToken': '@TokenHeaderValue()'
}
});
</script>
Saat Anda memproses permintaan, ekstrak token dari header permintaan. Kemudian panggil metode AntiForgery.Validate untuk memvalidasi token. Metode Validasi memberikan pengecualian jika token tidak valid.
void ValidateRequestHeader(HttpRequestMessage request)
{
string cookieToken = "";
string formToken = "";
IEnumerable<string> tokenHeaders;
if (request.Headers.TryGetValues("RequestVerificationToken", out tokenHeaders))
{
string[] tokens = tokenHeaders.First().Split(':');
if (tokens.Length == 2)
{
cookieToken = tokens[0].Trim();
formToken = tokens[1].Trim();
}
}
AntiForgery.Validate(cookieToken, formToken);
}