Memasukkan input pengguna secara langsung ke dalam pertanyaan SQL tanpa sebarang pengubahsuaian menyebabkan aplikasi terdedah kepada serangan suntikan SQL. Untuk mengelakkan ini, adalah penting untuk mengasingkan data daripada SQL untuk memastikan data kekal sebagai data dan tidak pernah ditafsirkan sebagai arahan oleh penghurai SQL.
Penyelesaian Paling Berkesan
Pendekatan yang disyorkan untuk mengelakkan serangan suntikan SQL, tanpa mengira pangkalan data yang digunakan, adalah menggunakan penyata yang disediakan dan pertanyaan berparameter. Ini adalah pernyataan SQL yang dihuraikan secara bebas oleh pelayan pangkalan data bersama-sama dengan parameter. Pendekatan ini menjadikan penyerang mustahil untuk menyuntik SQL berniat jahat.
Pelaksanaan Menggunakan PDO atau MySQLi
PDO menyediakan penyelesaian universal untuk semua pemacu pangkalan data yang disokong, manakala MySQLi adalah khusus kepada MySQL.
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute(['name' => $name]); foreach ($stmt as $row) { // Do something with $row }
$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]); while ($row = $result->fetch_assoc()) { // Do something with $row }
$stmt = $db->prepare('SELECT * FROM employees WHERE name = ?'); $stmt->bind_param('s', $name); // 's' specifies string type $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // Do something with $row }
Persediaan Sambungan Betul
Apabila menggunakan PDO untuk MySQL, pastikan kenyataan yang disediakan sebenar digunakan dengan melumpuhkan emulasi.
$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8mb4', 'user', 'password'); $dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Untuk MySQLi, gunakan yang berikut:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // error reporting $dbConnection = new mysqli('127.0.0.1', 'username', 'password', 'test'); $dbConnection->set_charset('utf8mb4'); // charset
Penjelasan
Pernyataan yang disediakan dihuraikan dan disusun oleh pelayan pangkalan data , memisahkan pernyataan SQL daripada parameter. Apabila parameter diluluskan, ia digabungkan dengan pernyataan yang disusun sebagai rentetan, menghapuskan risiko suntikan SQL.
Pertanyaan Dinamik
Sementara pernyataan yang disediakan boleh digunakan untuk parameter dalam pertanyaan dinamik, struktur pertanyaan dinamik itu sendiri tidak boleh diparameterkan. Dalam kes ini, anda dinasihatkan untuk menggunakan penapis senarai putih.
Atas ialah kandungan terperinci Bagaimana untuk Mencegah Suntikan SQL dengan Berkesan dalam Aplikasi PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!