CSRF adalah aktivitas jahat yang dilakukan oleh penyerang, yang melakukan tindakan atas nama pengguna yang diautentikasi, yang merugikan keamanan web. Untungnya, Laravel menyediakan alat untuk mencegah jenis kerentanan ini.
Serangan CSRF membajak sesi pengguna. Mereka melakukan ini dengan menipu pengguna agar mengirimkan permintaan melalui tag formulir tersembunyi atau URL jahat (gambar atau tautan) tanpa sepengetahuan pengguna.
Serangan ini menyebabkan perubahan status sesi pengguna, kebocoran data, dan terkadang peretas dapat memanipulasi data pengguna akhir dalam suatu aplikasi.
Gambar di atas mengilustrasikan skenario di mana keamanan web dilanggar. Korban mengirimkan permintaan dengan mengklik tautan (diterima), mengirimkan permintaan ke server situs web yang akan menghasilkan efek yang diinginkan oleh peretas, yang memiliki informasi yang berguna untuk mengakses dan memanipulasi server situs web.
Untuk meningkatkan keamanan web aplikasi Anda, di setiap sesi pengguna, Laravel menghasilkan token aman yang digunakannya untuk memastikan bahwa pengguna yang diautentikasi adalah yang meminta aplikasi tersebut.
Karena token ini berubah setiap kali sesi pengguna dibuat ulang, penyerang tidak dapat mengaksesnya.
Setiap kali ada permintaan untuk mengubah informasi pengguna di sisi server (backend) seperti POST
, PUT
, PATCH
e DELETE
, Anda harus menyertakan arahan @csrf
dalam formulir permintaan blade
HTML. Itu @csrf
karena itu merupakan arahan Blade
digunakan untuk menghasilkan token tersembunyi yang divalidasi oleh aplikasi.
Direktif Blade
adalah sintaks yang digunakan dalam mesin template Laravel yang disebut Mata pisau . Untuk membuat file blade
Anda harus memberinya nama – dalam bentuk kasus kami – diikuti dengan perpanjangan mata pisau. Ini berarti bahwa file tersebut akan memiliki nama form.blade.php
.
Filenya digunakan blade
untuk merender tampilan bagi pengguna di halaman web Ada beberapa pra-arahandefisintaks steno nite atau blade yang dapat Anda gunakan. Misalnya, @if
periksa apakah suatu kondisi terpenuhi, @empty
periksa apakah catatan tidak kosong, @auth
periksa apakah pengguna diautentikasi dan sebagainya.
Tapi mari kita kembali ke arahan @csrf
. Inilah cara Anda menggunakannya:
<form method="POST" action="{{route('pay')}}">
@csrf
</form>
Laravel versi sebelumnya memiliki pengaturan yang berbeda: keduanya berfungsi dan melakukan hal yang sama.
<form method="POST" action="{{route('pay')}}">
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>
Saat token CSRF hilang dari permintaan formulir yang dikirimkan atau jika tampaknya tidak valid, Laravel melempar pesan kesalahan "Halaman Kedaluwarsa" dengan kode status 419.
Alat tengah VerifyCsrfToken
menangani verifikasi CSRF dalam aplikasi Laravel. Itu middleware
terdaftar di Kernel.php
dan terletak di direktori app/Http/Middleware
. Ini berarti bahwa middleware
itu dipicu untuk permintaan di dalam web, tidak terkait dengan API.
protected $middlewareGroups = [
'web' => [
.
.
.
.
.
\App\Http\Middleware\VerifyCsrfToken::class,
],
];
Middleware VerifyCsrfToken memperluas kelas Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
, yaitu verifikasi CSRF adalah defimalam di dalam kelas.
Mari gali lebih dalam untuk mengetahui bagaimana Laravel menangani verifikasi CSRF.
Di dalam kelas, kita memiliki fungsi tokensMatch
.
protected function tokensMatch($request)
{
$token = $this->getTokenFromRequest($request);
return is_string($request->session()->token()) &&
is_string($token) &&
hash_equals($request->session()->token(), $token);
}
dalam kode menentukan apakah sesi dan input token CSRF cocok.
Fungsi melakukan dua hal:
$this->getTokenFromRequest
token dari permintaan masuk yang dilampirkan melalui bidang tersembunyi atau header permintaan. Token didekripsi dan kemudian dikembalikan ke variabel token.protected function getTokenFromRequest($request)
{
$token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');
if (! $token && $header = $request->header('X-XSRF-TOKEN')) {
try {
$token = CookieValuePrefix::remove($this->encrypter->decrypt($header, static::serialized()));
} catch (DecryptException $e) {
$token = '';
}
}
return $token;
}
Dalam kode itu mendapat token dari header
2. Keluarkan token permintaan dan sesi ke string lalu gunakan hash_equals
dibangun di PHP untuk membandingkan jika kedua string sama. Hasil operasi ini selalu bool (benar) atau (salah) .
Ercole Palmeri
Operasi oftalmoplasti menggunakan penampil komersial Apple Vision Pro dilakukan di Poliklinik Catania…
Mengembangkan keterampilan motorik halus melalui mewarnai mempersiapkan anak untuk keterampilan yang lebih kompleks seperti menulis. Mewarnai…
Sektor angkatan laut adalah kekuatan ekonomi global sejati, yang telah menuju pasar 150 miliar...
Senin lalu, Financial Times mengumumkan kesepakatan dengan OpenAI. FT melisensikan jurnalisme kelas dunianya…