Rumah > pangkalan data > tutorial mysql > Bagaimanakah Pertanyaan Berparameter dengan Tanda Soalan Menghalang Serangan Suntikan SQL?

Bagaimanakah Pertanyaan Berparameter dengan Tanda Soalan Menghalang Serangan Suntikan SQL?

Susan Sarandon
Lepaskan: 2025-01-09 21:21:43
asal
435 orang telah melayarinya

How Do Parameterized Queries with Question Marks Prevent SQL Injection Attacks?

Mencegah Suntikan SQL dengan Pertanyaan Berparameter: Pendekatan Tanda Tanya

Pertanyaan berparameter, yang ditunjukkan oleh tanda soal (?) dalam SQL, adalah pertahanan penting terhadap kelemahan suntikan SQL. Pertanyaan ini penting semasa membina dan melaksanakan pernyataan SQL secara dinamik dalam program.

Kelebihan teras pertanyaan berparameter berbanding pertanyaan yang dibina secara manual terletak pada keselamatan yang dipertingkatkan. Pustaka pangkalan data mengendalikan sisipan parameter, secara automatik menggunakan mekanisme melarikan diri yang diperlukan untuk mengelakkan suntikan kod berniat jahat. Pertimbangkan contoh mudah terjejas ini:

<code class="language-sql">string s = getStudentName();
cmd.CommandText = "SELECT * FROM students WHERE (name = '" + s + "')";
cmd.Execute();</code>
Salin selepas log masuk

Jika pengguna memasukkan: Robert'); DROP TABLE students; --

Pertanyaan yang terhasil menjadi mudah diserang.

Penyelesaian melibatkan penggunaan pertanyaan berparameter:

<code class="language-sql">s = getStudentName();
cmd.CommandText = "SELECT * FROM students WHERE name = ?";
cmd.Parameters.Add(s);
cmd.Execute();</code>
Salin selepas log masuk

Pustaka kini membersihkan input, menjadikan kod hasad tidak berbahaya: Pertanyaan secara berkesan menjadi "SELECT * FROM students WHERE name = 'Robert''); DROP TABLE students; --'" — kod yang disuntik dianggap sebagai teks literal.

Walaupun tanda soal ialah pemegang tempat yang digunakan secara meluas, sistem pangkalan data lain, seperti MS SQL Server, menggunakan parameter yang dinamakan (cth., @varname) untuk kebolehbacaan yang lebih baik:

<code class="language-sql">cmd.Text = "SELECT thingA FROM tableA WHERE thingB = @varname";
cmd.Parameters.AddWithValue("@varname", 7);
result = cmd.Execute();</code>
Salin selepas log masuk

Pendekatan ini menawarkan faedah keselamatan yang sama dengan pengenalpastian parameter yang lebih jelas.

Atas ialah kandungan terperinci Bagaimanakah Pertanyaan Berparameter dengan Tanda Soalan 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