Melindungi Terhadap Suntikan SQL dengan Penyata Disediakan
Pernyataan yang disediakan memberikan pertahanan yang kuat terhadap kelemahan suntikan SQL dengan mengasingkan kod secara bersih daripada data yang dibekalkan pengguna.
Memahami Ancaman Suntikan SQL
Eksploitasi suntikan SQL berlaku apabila data yang tidak dipercayai dibenamkan secara langsung dalam pertanyaan SQL. Amalan berbahaya ini mengaburkan garis antara kod dan data, membolehkan penyerang menyuntik arahan berniat jahat. Contoh mudah menggambarkan risiko:
<code class="language-sql">$query = "SELECT * FROM users WHERE id = '" . $_GET['id'] . "'";</code>
Jika $_GET['id']
mengandungi 1; DROP TABLE users; --
, pertanyaan yang terhasil menjadi:
<code class="language-sql">SELECT * FROM users WHERE id = '1; DROP TABLE users; --';</code>
Input berniat jahat ini melaksanakan perintah DROP TABLE users
, yang berpotensi memusnahkan pangkalan data.
Mekanik Penyata Disediakan
Pernyataan yang disediakan menangani kelemahan ini dengan memisahkan struktur pertanyaan daripada data. Prosesnya melibatkan dua langkah:
<code class="language-php">$stmt = $db->prepare("SELECT * FROM users WHERE id = ?");</code>
?
bertindak sebagai pemegang tempat untuk data.
<code class="language-php">$stmt->execute([$id]);</code>
Pangkalan data melaksanakan pertanyaan pra-disusun menggunakan data yang disediakan. Secara kritikal, data dianggap sebagai data, bukan kod boleh laku, menghalang serangan suntikan.
Pelaksanaan PHP/MySQL
Berikut ialah versi selamat bagi contoh sebelumnya menggunakan pernyataan yang disediakan:
<code class="language-php">$stmt = $db->prepare("SELECT * FROM users WHERE id = ?"); $stmt->bind_param("i", $expectedData); // "i" specifies integer data type $stmt->execute();</code>
Walaupun $expectedData
mengandungi input berniat jahat, ia dianggap sebagai nilai data, bukan sebagai kod SQL.
Pertimbangan Penting
Walaupun kenyataan yang disediakan sangat berkesan, ia tidak menawarkan perlindungan yang lengkap. Mereka terutamanya melindungi daripada suntikan literal data. Jika pengecam (nama jadual atau lajur) dibina secara dinamik dalam pertanyaan, langkah keselamatan tambahan adalah penting.
Atas ialah kandungan terperinci Bagaimanakah Kenyataan yang Disediakan Menghalang Serangan Suntikan SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!