Heim >Datenbank >MySQL-Tutorial >Wie kann ich eine SQL IN-Klausel mit einer dynamischen Anzahl von Argumenten sicher parametrisieren?

Wie kann ich eine SQL IN-Klausel mit einer dynamischen Anzahl von Argumenten sicher parametrisieren?

Linda Hamilton
Linda HamiltonOriginal
2025-01-25 16:36:10813Durchsuche

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

Parametrieren Sie die SQL IN-Klausel mit einer dynamischen Anzahl von Parametern

Parametrierte SQL-Abfragen tragen dazu bei, SQL-Injection-Angriffe zu verhindern. Beim Umgang mit einer variablen Anzahl von Argumenten kann der herkömmliche Ansatz (Parametrisierung jedes einzelnen Arguments in einer IN-Klausel) jedoch umständlich werden.

Parametrieren Sie jeden Wert

Eine elegantere Lösung besteht darin, jeden möglichen Wert in der IN-Klausel zu parametrisieren. Betrachten Sie beispielsweise die folgende Abfrage:

<code class="language-sql">SELECT * FROM Tags WHERE Name IN ('ruby','rails','scruffy','rubyonrails') ORDER BY Count DESC</code>

Um diese Abfrage zu parametrisieren, können Sie jeden Wert einem Array zuweisen und eine parametrisierte IN-Klausel erstellen:

<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>

Der von dieser Methode generierte Befehl enthält Parameter mit dynamisch generierten Namen und Werten:

<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>

Sicherheitsvorkehrungen

Es ist wichtig zu beachten, dass diese Methode vor SQL-Injection-Angriffen sicher ist, da die parametrisierten Werte nicht vom Benutzer eingegeben werden. Der einzige in den CommandText eingefügte Text ist das hartcodierte „@tag“-Präfix und der Index im Array, die nicht vom Benutzer generiert werden und daher sicher sind.

Das obige ist der detaillierte Inhalt vonWie kann ich eine SQL IN-Klausel mit einer dynamischen Anzahl von Argumenten sicher parametrisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn