Rumah >pembangunan bahagian belakang >tutorial php >Amalan terbaik pengaturcaraan PHP untuk mencegah serangan CSRF
Amalan Terbaik untuk Pengaturcaraan PHP untuk Mencegah Serangan CSRF
CSRF (Pemalsuan Permintaan Rentas Tapak) ialah kaedah serangan rangkaian biasa Penyerang menyamar permintaan daripada pengguna yang sah untuk membolehkan pengguna melakukan operasi berniat jahat tanpa pengetahuan mereka. Untuk melindungi pengguna dan aplikasi, pembangun perlu mengambil beberapa langkah untuk mencegah serangan CSRF. Artikel ini akan memperkenalkan beberapa amalan terbaik dalam pengaturcaraan PHP untuk mencegah serangan CSRF dan menyediakan beberapa contoh kod.
Berikut ialah contoh mudah menggunakan token CSRF:
// 生成CSRF令牌 function generateCSRFToken() { $token = bin2hex(random_bytes(32)); $_SESSION['csrf_token'] = $token; return $token; } // 在表单中包含CSRF令牌 function renderForm() { $csrfToken = generateCSRFToken(); echo '<form action="process.php" method="post">'; echo '<input type="hidden" name="csrf_token" value="' . $csrfToken . '">'; echo '<input type="text" name="username">'; echo '<input type="password" name="password">'; echo '<input type="submit" value="Submit">'; echo '</form>'; } // 处理表单提交请求 function processForm() { if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) { // 令牌无效,处理错误 echo 'Invalid CSRF token!'; return; } // 处理表单提交数据 $username = $_POST['username']; $password = $_POST['password']; // 执行其他操作 // ... } // 调用函数 renderForm(); processForm();
Dalam kod di atas, fungsi generateCSRFToken
bertanggungjawab untuk menjana token CSRF dan menyimpannya dalam sesi pengguna. Fungsi renderForm
bertanggungjawab untuk memberikan borang dan memasukkan token CSRF dalam medan tersembunyi. Fungsi processForm
bertanggungjawab untuk memproses permintaan penyerahan borang dan mengesahkan kesahihan token CSRF sebelum diproses. generateCSRFToken
函数负责生成CSRF令牌,并将其存储在用户的会话中。renderForm
函数负责渲染表单,并在隐藏的字段中包含CSRF令牌。processForm
函数负责处理表单提交请求,并在处理前验证CSRF令牌的有效性。
Referer
字段,确保请求是来自同一域名的。如果Referer
字段为空或不是期望的域名,服务器可以拒绝请求或执行其他自定义操作。以下是一个简单的验证请求来源的示例:
function processRequest() { $expectedDomain = 'https://www.example.com'; if (!isset($_SERVER['HTTP_REFERER']) || strpos($_SERVER['HTTP_REFERER'], $expectedDomain) !== 0) { // 请求来源无效,处理错误 echo 'Invalid request source!'; return; } // 处理请求 // ... }
在上述代码中,processRequest
函数负责处理请求,并验证请求来源。通过检查请求头中的Referer
Selain menggunakan token CSRF, anda juga boleh menghalang serangan CSRF dengan mengesahkan sumber permintaan. Apabila memproses permintaan, pelayan boleh menyemak medan Perujuk
kosong atau bukan nama domain yang diharapkan, pelayan boleh menolak permintaan atau melakukan tindakan tersuai yang lain.
Berikut ialah contoh mudah untuk mengesahkan sumber permintaan:
rrreee🎜Dalam kod di atas, fungsiprocessRequest
bertanggungjawab untuk memproses permintaan dan mengesahkan sumber permintaan. Pelayan boleh menentukan kesahihan permintaan dengan menyemak sama ada medan Atas ialah kandungan terperinci Amalan terbaik pengaturcaraan PHP untuk mencegah serangan CSRF. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!