Bagaimana untuk menangani serangan Cross-site Request Forgery (CSRF) dalam PHP?
Ikhtisar:
Memandangkan serangan siber terus berkembang, melindungi keselamatan tapak web telah menjadi salah satu tugas penting bagi pembangun. Serangan Pemalsuan Permintaan Silang Tapak (CSRF) ialah ancaman keselamatan biasa Penyerang menipu pengguna untuk melakukan operasi yang tidak dijangka, membolehkan pengguna menghantar permintaan berniat jahat tanpa pengetahuan mereka. Untuk mengelakkan serangan sedemikian, pembangun boleh mengambil beberapa langkah untuk melindungi tapak mereka. Artikel ini akan menerangkan cara mengendalikan serangan CSRF dalam PHP.
- Fahami prinsip serangan CSRF:
Sebelum kita mula menangani serangan CSRF, kita perlu memahami prinsip serangan. Serangan CSRF dilakukan dengan memanfaatkan kelayakan log masuk pengguna di tapak web lain untuk melakukan tindakan yang tidak dibenarkan. Penyerang akan memalsukan permintaan dan menghantarnya ke tapak web sasaran, yang akan dilaksanakan menggunakan identiti pengguna. Selepas tapak web menerima permintaan, ia akan tersilap percaya bahawa permintaan itu dihantar oleh pengguna sendiri. Oleh itu, memahami prinsip ini adalah penting untuk mempertahankan secara berkesan daripada serangan CSRF.
- Gunakan pengesahan Token:
Pengesahan token ialah cara biasa untuk mempertahankan diri daripada serangan CSRF. Ia berdasarkan penjanaan pengecam unik (Token) untuk setiap pengguna dan membenamkan Token ini ke dalam borang. Apabila pengguna menyerahkan borang, pelayan akan mengesahkan sama ada Token dalam borang itu konsisten dengan Token dalam Sesi pengguna. Jika ia tidak konsisten, ini bermakna ini adalah permintaan berniat jahat dan pelayan akan menolak untuk melaksanakannya.
Berikut ialah contoh kod menggunakan pengesahan Token:
// 生成Token
$token = bin2hex(random_bytes(32));
$_SESSION['csrf_token'] = $token;
// 将Token嵌入到表单中
<form method="post" action="process.php">
<input type="hidden" name="csrf_token" value="<?php echo $token; ?>">
<!-- other form fields -->
<input type="submit" value="Submit">
</form>
// 在处理请求时验证Token
session_start();
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die("Invalid CSRF token");
}
// 处理请求
Salin selepas log masuk
- Sekat Perujuk HTTP:
Perujuk HTTP ialah pengepala permintaan HTTP yang mengandungi URL halaman tempat permintaan dimulakan. Kami boleh menggunakan medan pengepala ini untuk mengesahkan sama ada permintaan itu datang daripada nama domain yang sama. Apabila mengesahkan permintaan, kami boleh menyemak sama ada Perujuk yang diminta adalah sama dengan nama domain semasa. Jika ia berbeza, ia mungkin permintaan yang berniat jahat. Walau bagaimanapun, perlu diingatkan bahawa Perujuk mungkin dilumpuhkan atau dipalsukan oleh sesetengah penyemak imbas atau pelayan proksi, jadi kaedah ini tidak menjamin keselamatan yang lengkap.
Berikut ialah contoh kod untuk menghadkan Perujuk HTTP:
$referer = $_SERVER['HTTP_REFERER'];
$allowed_referer = 'https://www.example.com';
if (strpos($referer, $allowed_referer) !== 0) {
die("Invalid Referer");
}
// 处理请求
Salin selepas log masuk
- Tetapkan atribut Kuki SameSite:
Dalam PHP 7.3 dan ke atas, atribut SameSite boleh ditetapkan pada Kuki. Atribut SameSite boleh menentukan bahawa kuki hanya boleh digunakan pada tapak yang sama, dengan itu berkesan menghalang serangan CSRF. Anda boleh menetapkan atribut SameSite kuki kepada "Strict" atau "Lax". "Ketat" bermaksud kuki hanya dibenarkan untuk digunakan oleh tapak yang sama, manakala "Lax" bermaksud kuki dibenarkan dalam beberapa situasi merentas tapak, tetapi tidak dalam permintaan POST.
Berikut ialah contoh kod untuk menetapkan atribut Kuki SameSite:
session_start();
session_set_cookie_params([
'httponly' => true,
'samesite' => 'Lax'
]);
Salin selepas log masuk
Kesimpulan:
Mengendalikan serangan CSRF dalam PHP memerlukan satu siri langkah keselamatan. Menggunakan pengesahan Token, mengehadkan Perujuk HTTP dan menetapkan atribut Kuki SameSite adalah semua cara yang berkesan untuk mempertahankan diri daripada serangan CSRF. Walaupun kaedah ini boleh meningkatkan keselamatan tapak web, pembangun harus sentiasa memberi perhatian yang teliti terhadap ancaman keselamatan baharu dan amalan terbaik serta mengemas kini langkah perlindungan tepat pada masanya untuk memastikan keselamatan tapak web.
Atas ialah kandungan terperinci Bagaimana untuk mengendalikan serangan pemalsuan permintaan silang tapak (CSRF) dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!