Rumah >pangkalan data >tutorial mysql >Bagaimanakah saya boleh memarameterkan klausa SQL dengan selamat dengan bilangan argumen yang dinamik?

Bagaimanakah saya boleh memarameterkan klausa SQL dengan selamat dengan bilangan argumen yang dinamik?

Linda Hamilton
Linda Hamiltonasal
2025-01-25 16:36:10810semak imbas

How Can I Securely Parameterize an SQL IN Clause with a Dynamic Number of Arguments?

Gunakan bilangan parameter dinamik ke parameter SQL dalam klausa

Parameter SQL Query membantu mencegah SQL daripada menyuntik serangan. Walau bagaimanapun, apabila memproses parameter pembolehubah, kaedah tradisional (parameterisasi setiap parameter berasingan dalam klausa) mungkin menjadi sangat rumit.

parameterisasi setiap nilai

Penyelesaian yang lebih elegan adalah setiap nilai yang mungkin dalam parameter dalam klausa. Sebagai contoh, pertimbangkan pertanyaan berikut:

<code class="language-sql">SELECT * FROM Tags WHERE Name IN ('ruby','rails','scruffy','rubyonrails') ORDER BY Count DESC</code>
Untuk parameterkan pertanyaan ini, anda boleh memperuntukkan setiap nilai ke array dan membuat parameter dalam klausa:

<code class="language-csharp">string[] tags = new string[] { "ruby", "rails", "scruffy", "rubyonrails" };
string cmdText = "SELECT * FROM Tags WHERE Name IN ({0})";

string[] paramNames = tags.Select((s, i) => "@tag" + i.ToString()).ToArray();

string inClause = string.Join(",", paramNames);
using (SqlCommand cmd = new SqlCommand(string.Format(cmdText, inClause)))
{
    for (int i = 0; i < tags.Length; i++)
    {
        cmd.Parameters.AddWithValue(paramNames[i], tags[i]);
    }
    // ... 执行查询 ...
}</code>
Perintah yang dihasilkan oleh kaedah ini mengandungi parameter dan nilai nama dan nilai yang dihasilkan dinamik:

<code class="language-sql">cmd.CommandText = "SELECT * FROM Tags WHERE Name IN (@tag0, @tag1, @tag2, @tag3)"
cmd.Parameters["@tag0"] = "ruby"
cmd.Parameters["@tag1"] = "rails"
cmd.Parameters["@tag2"] = "scruffy"
cmd.Parameters["@tag3"] = "rubyonrails"</code>
langkah berjaga -jaga keselamatan

Harus diingat bahawa kaedah ini dengan selamat dapat menghalang SQL daripada menyuntik serangan, kerana nilai parameterisasi tidak dimasukkan oleh pengguna. Satu -satunya teks yang disuntik ke dalam commandtext adalah awalan "@tag" yang dikodkan keras dan indeks array.

Atas ialah kandungan terperinci Bagaimanakah saya boleh memarameterkan klausa SQL dengan selamat dengan bilangan argumen yang dinamik?. 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