Rumah >pembangunan bahagian belakang >tutorial php >Bagaimanakah Penyata Disediakan Boleh Menghalang Suntikan SQL dalam PHP?

Bagaimanakah Penyata Disediakan Boleh Menghalang Suntikan SQL dalam PHP?

Susan Sarandon
Susan Sarandonasal
2025-01-01 09:08:11422semak imbas

How Can Prepared Statements Prevent SQL Injection in PHP?

Melindungi Terhadap SQL Injection 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;--')

Strategi Pencegahan

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.

Melaksanakan Penyata Disediakan

PDO

$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute([ 'name' => $name ]);

foreach ($stmt as $row) {
    // Do something with $row
}

MySQLi untuk MySQL (PHP 8.2 )

$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]);
while ($row = $result->fetch_assoc()) {
    // Do something with $row
}

MySQLi untuk MySQL (Sehingga PHP 8.1)

$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
}

Langkah Berjaga-jaga Tambahan untuk PDO dan MySQLi

PDO

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);

MySQLi

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

Memahami Penyata Disediakan

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.

Kaveat

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn