Utilisez le nombre de paramètres dynamiques pour paramètre SQL dans la clause
Le paramètre La requête SQL aide à empêcher SQL d'injecter des attaques. Cependant, lors du traitement des paramètres des variables, la méthode traditionnelle (paramétrage de chaque paramètre séparé dans les clauses) peut devenir très encombrant.
Paramétrage par valeur
Une solution plus élégante est chaque valeur possible dans la clause paramétrée dans la clause. Par exemple, considérez les demandes suivantes:
SELECT * FROM Tags WHERE Name IN ('ruby','rails','scruffy','rubyonrails') ORDER BY Count DESC
Copier après la connexion
Pour paramétrer cette requête, vous pouvez allouer chaque valeur à un tableau et créer un paramétré dans la clause:
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]);
}
// ... 执行查询 ...
}
Copier après la connexion
La commande générée par cette méthode contient les paramètres et les valeurs des noms et valeurs générés dynamiques:
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"
Copier après la connexion
Précautions de sécurité
Il convient de noter que cette méthode peut empêcher SQL d'injecter en toute sécurité les attaques, car la valeur de paramétrage n'est pas entrée par l'utilisateur. Le seul texte injecté dans le texte de commande est le préfixe "@tag" codé dur et l'index du tableau.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!