Pertanyaan berparameter SQL dengan tanda soal
Apabila merujuk dokumentasi SQL, anda mungkin menghadapi tanda tanya (?) dalam pertanyaan. Pemegang tempat ini mewakili pertanyaan berparameter dan digunakan secara meluas untuk melaksanakan SQL dinamik dalam atur cara.
Pertanyaan berparameter mempunyai banyak kelebihan. Mereka memudahkan kod dengan menyahganding nilai parameter daripada pertanyaan itu sendiri, menjadikannya lebih cekap dan fleksibel. Selain itu, mereka meningkatkan keselamatan dengan menghalang serangan suntikan SQL.
Sebagai contoh, dalam contoh pseudokod:
<code>ODBCCommand cmd = new ODBCCommand("SELECT thingA FROM tableA WHERE thingB = 7") result = cmd.Execute()</code>
boleh ditulis semula sebagai:
<code>ODBCCommand cmd = new ODBCCommand("SELECT thingA FROM tableA WHERE thingB = ?") cmd.Parameters.Add(7) result = cmd.Execute()</code>
Teknik ini memastikan pelepasan rentetan yang betul, menghapuskan risiko suntikan SQL. Pertimbangkan senario berikut:
<code>string s = getStudentName() cmd.CommandText = "SELECT * FROM students WHERE (name = '" + s + "')" cmd.Execute()</code>
Jika pengguna memasukkan rentetan Robert'); pelajar DROP TABLE --, serangan suntikan SQL mungkin berlaku. Walau bagaimanapun, menggunakan pertanyaan berparameter:
<code>s = getStudentName() cmd.CommandText = "SELECT * FROM students WHERE name = ?" cmd.Parameters.Add(s) cmd.Execute()</code>
Fungsi perpustakaan akan membersihkan input untuk mengelakkan pelaksanaan kod berniat jahat.
Sebagai alternatif, Microsoft SQL Server menggunakan parameter bernama, yang meningkatkan kebolehbacaan dan kejelasan:
<code>cmd.Text = "SELECT thingA FROM tableA WHERE thingB = @varname" cmd.Parameters.AddWithValue("@varname", 7) result = cmd.Execute()</code>
Atas ialah kandungan terperinci Bagaimanakah Pertanyaan Berparameter dalam SQL Menghalang Serangan Suntikan SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!