Rumah > pangkalan data > tutorial mysql > Bagaimanakah Kenyataan yang Disediakan Menghalang Serangan Suntikan SQL?

Bagaimanakah Kenyataan yang Disediakan Menghalang Serangan Suntikan SQL?

Barbara Streisand
Lepaskan: 2025-01-23 20:48:11
asal
823 orang telah melayarinya

How Do Prepared Statements Prevent SQL Injection Attacks?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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:

  1. Kompilasi Pertanyaan: Pangkalan data menerima struktur pertanyaan dengan ruang letak:
<code class="language-php">$stmt = $db->prepare("SELECT * FROM users WHERE id = ?");</code>
Salin selepas log masuk

? bertindak sebagai pemegang tempat untuk data.

  1. Pengikatan Data: Data kemudiannya dihantar secara berasingan:
<code class="language-php">$stmt->execute([$id]);</code>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan