Apakah CSRF?
Pemalsuan Permintaan Silang Tapak (CSRF) ialah kerentanan keselamatan web yang membenarkan penyerang memperdaya pengguna yang disahkan supaya melaksanakan tindakan yang tidak diingini pada tapak web yang mereka log masuk pada masa ini. Serangan itu berfungsi dengan mengeksploitasi kepercayaan yang dimiliki tapak web dalam penyemak imbas pengguna.
Cara Serangan CSRF Berfungsi
- Pengguna log masuk ke tapak web A yang sah dan menerima kuki sesi
- Pengguna melawat tapak web berniat jahat B semasa masih log masuk ke A
- Tapak web B mengandungi kod yang membuat permintaan ke tapak web A
- Pelayar menyertakan kuki sesi secara automatik
- Tapak Web A memproses permintaan itu menganggap ia sah
Kaedah Perlindungan CSRF dalam PHP
1. Perlindungan Berasaskan Token Menggunakan Input Tersembunyi
Ini adalah kaedah yang paling biasa. Begini cara untuk melaksanakannya:
// In your session initialization (e.g., at login) session_start(); if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); } // In your form function generateFormWithCSRFToken() { return ''; } // In your form processing function validateCSRFToken() { if (!isset($_POST['csrf_token']) || !isset($_SESSION['csrf_token']) || !hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) { die('CSRF token validation failed'); } return true; }
2. Perlindungan CSRF Menggunakan Pengepala Tersuai
Kaedah ini menggunakan permintaan AJAX dengan pengepala tersuai:
// PHP Backend session_start(); if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); } // Validate the token if ($_SERVER['REQUEST_METHOD'] === 'POST') { $headers = getallheaders(); if (!isset($headers['X-CSRF-Token']) || !hash_equals($_SESSION['csrf_token'], $headers['X-CSRF-Token'])) { http_response_code(403); die('CSRF token validation failed'); } } // JavaScript Frontend const csrfToken = '<?php echo $_SESSION["csrf_token"]; ?>'; fetch('/api/endpoint', { method: 'POST', headers: { 'X-CSRF-Token': csrfToken, 'Content-Type': 'application/json' }, body: JSON.stringify(data) });
3. Serah Berganda Corak Kuki
Kaedah ini melibatkan penghantaran token sebagai kuki dan sebagai parameter permintaan:
// Set both cookie and session token session_start(); $token = bin2hex(random_bytes(32)); $_SESSION['csrf_token'] = $token; setcookie('csrf_token', $token, [ 'httponly' => true, 'secure' => true, 'samesite' => 'Strict' ]); // Validation function function validateDoubleSubmitToken() { if (!isset($_COOKIE['csrf_token']) || !isset($_POST['csrf_token']) || !isset($_SESSION['csrf_token'])) { return false; } return hash_equals($_COOKIE['csrf_token'], $_POST['csrf_token']) && hash_equals($_SESSION['csrf_token'], $_POST['csrf_token']); }
4. Atribut Kuki SameSite
Aplikasi moden juga boleh menggunakan atribut kuki SameSite sebagai lapisan perlindungan tambahan:
// Set cookie with SameSite attribute session_start(); session_set_cookie_params([ 'lifetime' => 0, 'path' => '/', 'domain' => $_SERVER['HTTP_HOST'], 'secure' => true, 'httponly' => true, 'samesite' => 'Strict' ]);
Amalan Terbaik untuk Perlindungan CSRF
-
Penjanaan Token
- Gunakan penjana nombor rawak selamat secara kriptografi
- Buat token cukup panjang (sekurang-kurangnya 32 bait)
- Jana token baharu untuk setiap sesi
function generateSecureToken($length = 32) { return bin2hex(random_bytes($length)); }
-
Pengesahan Token
- Gunakan fungsi perbandingan selamat masa
- Sahkan kehadiran dan nilai token
- Laksanakan pengendalian ralat yang betul
function validateToken($userToken, $storedToken) { if (empty($userToken) || empty($storedToken)) { return false; } return hash_equals($storedToken, $userToken); }
-
Pelaksanaan Borang
- Sertakan token dalam semua bentuk
- Laksanakan suntikan token automatik
- Kendalikan putaran token
class CSRFProtection { public static function getTokenField() { return sprintf( '<input type="hidden" name="csrf_token" value="%s">', htmlspecialchars($_SESSION['csrf_token']) ); } }
Perlindungan Khusus Rangka Kerja
Banyak rangka kerja PHP menyediakan perlindungan CSRF terbina dalam:
Contoh Laravel
// In your session initialization (e.g., at login) session_start(); if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); } // In your form function generateFormWithCSRFToken() { return ''; } // In your form processing function validateCSRFToken() { if (!isset($_POST['csrf_token']) || !isset($_SESSION['csrf_token']) || !hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) { die('CSRF token validation failed'); } return true; }
Contoh Symfony
// PHP Backend session_start(); if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); } // Validate the token if ($_SERVER['REQUEST_METHOD'] === 'POST') { $headers = getallheaders(); if (!isset($headers['X-CSRF-Token']) || !hash_equals($_SESSION['csrf_token'], $headers['X-CSRF-Token'])) { http_response_code(403); die('CSRF token validation failed'); } } // JavaScript Frontend const csrfToken = '<?php echo $_SESSION["csrf_token"]; ?>'; fetch('/api/endpoint', { method: 'POST', headers: { 'X-CSRF-Token': csrfToken, 'Content-Type': 'application/json' }, body: JSON.stringify(data) });
Perangkap Biasa yang Perlu Dielakkan
- Jangan gunakan token yang boleh diramal
- Jangan simpan token dalam pembolehubah JavaScript yang boleh diakses secara global
- Jangan langkau perlindungan CSRF untuk permintaan AJAX
- Jangan bergantung semata-mata pada menyemak pengepala Perujuk
- Jangan gunakan token yang sama untuk berbilang borang
Perlindungan CSRF adalah penting untuk keselamatan aplikasi web. Walaupun terdapat pelbagai pendekatan untuk melaksanakan perlindungan CSRF, pendekatan berasaskan token menggunakan medan borang tersembunyi kekal sebagai kaedah yang paling banyak digunakan dan boleh dipercayai. Ingat untuk menggabungkan kaedah perlindungan yang berbeza untuk keselamatan yang dipertingkatkan dan sentiasa ikuti amalan terbaik keselamatan apabila melaksanakan perlindungan CSRF dalam aplikasi PHP anda.
Ingat bahawa perlindungan CSRF harus menjadi sebahagian daripada strategi keselamatan yang lebih luas yang merangkumi pengurusan sesi yang betul, pengendalian kuki selamat dan pengesahan input.
Atas ialah kandungan terperinci Perlindungan CSRF dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Laravel memudahkan mengendalikan data sesi sementara menggunakan kaedah flash intuitifnya. Ini sesuai untuk memaparkan mesej ringkas, makluman, atau pemberitahuan dalam permohonan anda. Data hanya berterusan untuk permintaan seterusnya secara lalai: $ permintaan-

Pelanjutan URL Pelanggan PHP (CURL) adalah alat yang berkuasa untuk pemaju, membolehkan interaksi lancar dengan pelayan jauh dan API rehat. Dengan memanfaatkan libcurl, perpustakaan pemindahan fail multi-protokol yang dihormati, php curl memudahkan execu yang cekap

Laravel menyediakan sintaks simulasi respons HTTP ringkas, memudahkan ujian interaksi HTTP. Pendekatan ini dengan ketara mengurangkan redundansi kod semasa membuat simulasi ujian anda lebih intuitif. Pelaksanaan asas menyediakan pelbagai jenis pintasan jenis tindak balas: Gunakan Illuminate \ Support \ Facades \ http; Http :: palsu ([ 'Google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

Adakah anda ingin memberikan penyelesaian segera, segera kepada masalah yang paling mendesak pelanggan anda? Sembang langsung membolehkan anda mempunyai perbualan masa nyata dengan pelanggan dan menyelesaikan masalah mereka dengan serta-merta. Ia membolehkan anda memberikan perkhidmatan yang lebih pantas kepada adat anda

Pembalakan PHP adalah penting untuk memantau dan menyahpepijat aplikasi web, serta menangkap peristiwa kritikal, kesilapan, dan tingkah laku runtime. Ia memberikan pandangan yang berharga dalam prestasi sistem, membantu mengenal pasti isu -isu, dan menyokong penyelesaian masalah yang lebih cepat

Artikel membincangkan pengikatan statik lewat (LSB) dalam PHP, yang diperkenalkan dalam Php 5.3, yang membolehkan resolusi runtime kaedah statik memerlukan lebih banyak warisan yang fleksibel. Isu: LSB vs polimorfisme tradisional; Aplikasi Praktikal LSB dan Potensi Perfo

Artikel ini membincangkan menambah fungsi khusus kepada kerangka kerja, memberi tumpuan kepada pemahaman seni bina, mengenal pasti titik lanjutan, dan amalan terbaik untuk integrasi dan debugging.

Artikel membincangkan ciri -ciri keselamatan penting dalam rangka kerja untuk melindungi daripada kelemahan, termasuk pengesahan input, pengesahan, dan kemas kini tetap.


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

EditPlus versi Cina retak
Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

VSCode Windows 64-bit Muat Turun
Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft

Dreamweaver Mac版
Alat pembangunan web visual

MinGW - GNU Minimalis untuk Windows
Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.

PhpStorm versi Mac
Alat pembangunan bersepadu PHP profesional terkini (2018.2.1).