Rumah >pembangunan bahagian belakang >tutorial php >Bagaimanakah Penyata Disediakan Boleh Menghalang Suntikan SQL dalam PHP?
Apabila menyepadukan input pengguna ke dalam pertanyaan SQL tanpa langkah berjaga-jaga yang sewajarnya, kerentanan kod kepada suntikan SQL timbul. Pertimbangkan coretan kod terdedah berikut:
$unsafe_variable = $_POST['user_input']; mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
Senario ini boleh dieksploitasi melalui rentetan input pengguna, seperti nilai'); DROP TABLE jadual;--, membawa kepada pertanyaan berniat jahat:
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Untuk mengelakkan serangan sedemikian, adalah penting untuk mengasingkan data daripada SQL, memastikan data dianggap sebagai data dan tidak ditafsirkan sebagai arahan oleh penghurai SQL. Penyataan yang disediakan dengan pertanyaan berparameter menawarkan penyelesaian yang mantap, memisahkan penyataan SQL dan nilai parameter. Pelayan pangkalan data menghuraikan dan menyusun pernyataan SQL, menganggap parameter sebagai rentetan, menyekat percubaan suntikan SQL yang berniat jahat secara berkesan.
$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 the variable type => 'string' $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // Do something with $row }
Secara lalai, PDO menggunakan kenyataan yang disediakan yang dicontohi. Untuk melumpuhkan emulasi dan menguatkuasakan kenyataan yang disediakan benar untuk MySQL, tetapkan:
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
Begitu juga, tetapkan:
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
Penyata yang disediakan dihuraikan dan disusun oleh pelayan pangkalan data semasa pelaksanaan. Parameter memberitahu enjin pangkalan data tempat untuk menggunakan penapis. Apabila melaksanakan pernyataan yang disediakan dengan nilai, pernyataan yang disusun digabungkan dengan nilai tersebut, bukan rentetan SQL. Ini menghalang suntikan rentetan berniat jahat yang boleh membawa kepada pelaksanaan SQL yang tidak diingini.
Pernyataan yang disediakan tidak sesuai untuk pertanyaan dinamik yang struktur pertanyaan diubah. Dalam kes sedemikian, penapis senarai putih yang mengehadkan nilai yang mungkin harus digunakan.
Atas ialah kandungan terperinci Bagaimanakah Penyata Disediakan Boleh Menghalang Suntikan SQL dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!