SQL injection kekal sebagai ancaman utama kepada aplikasi web, kerana ia membolehkan penyerang memanipulasi pertanyaan pangkalan data dan berpotensi menjejaskan data sensitif. Memahami cara mencegah kerentanan ini adalah penting untuk menjaga integriti pangkalan data.
Penyelesaian yang paling berkesan untuk suntikan SQL adalah dengan memastikan data berasingan daripada arahan SQL. Data harus dianggap sebagai input mentah, tidak sekali-kali membenarkan tafsiran sebagai arahan oleh pelayan pangkalan data. Ini boleh dicapai melalui penggunaan pernyataan yang disediakan dan pertanyaan berparameter, yang menawarkan beberapa faedah:
Menggunakan pernyataan yang disediakan dengan PDO (untuk semua pangkalan data yang disokong) atau MySQLi (untuk MySQL) menawarkan mekanisme yang teguh untuk menghalang SQL suntikan:
PDO:
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute(['name' => $name]);
MySQLi:
$stmt = $db->prepare('SELECT * FROM employees WHERE name = ?'); $stmt->bind_param('s', $name); $stmt->execute();
Untuk memastikan kefungsian yang betul, PDO dan MySQLi memerlukan khusus konfigurasi:
PDO:
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbConnection->set_charset('utf8mb4');
MySQLi:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); $dbConnection->set_charset('utf8mb4');
Selain mencegah suntikan SQL, kenyataan yang disediakan menawarkan tambahan kelebihan:
Walaupun pernyataan yang disediakan menyokong parameterisasi, ia tidak boleh digunakan untuk mengubah struktur pertanyaan secara dinamik. Pendekatan alternatif, seperti penapis senarai putih, disyorkan untuk senario ini.
Atas ialah kandungan terperinci Bagaimanakah Penyata yang Disediakan dalam PHP Boleh Mencegah Serangan Suntikan SQL dengan Berkesan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!