J'ai entendu dire que «tout le monde» utilise des requêtes SQL paramétrées pour se protéger contre les attaques par injection SQL sans avoir à valider chaque élément d'entrée utilisateur.
Comment est-ce que tu fais ça? Obtenez-vous cela automatiquement lorsque vous utilisez des procédures stockées?
Donc, je comprends que cela n'est pas paramétré:
cmdText = String.Format("SELECT foo FROM bar WHERE baz = '{0}'", fuz)
Serait-ce paramétré?
cmdText = String.Format("EXEC foo_from_baz '{0}'", fuz)
Ou dois-je faire quelque chose de plus complet comme celui-ci pour me protéger de l'injection SQL?
With command
.Parameters.Count = 1
.Parameters.Item(0).ParameterName = "@baz"
.Parameters.Item(0).Value = fuz
End With
Existe-t-il d'autres avantages à utiliser des requêtes paramétrées en plus des considérations de sécurité?
Mise à jour: Cet article génial était lié à l'une des références de questions de Grotok. http://www.sommarskog.se/dynamic_sql.html
sql
vb.net
sql-parametrized-query
Jim compte
la source
la source
Réponses:
Votre exemple EXEC ne sera PAS paramétré. Vous avez besoin de requêtes paramétrées (instructions préparées dans certains cercles) pour empêcher une entrée comme celle-ci de causer des dommages:
Essayez de mettre cela dans votre variable fuz (ou non, si vous appréciez votre table de bar). Des requêtes plus subtiles et dommageables sont également possibles.
Voici un exemple de la façon dont vous faites des paramètres avec Sql Server:
Les procédures stockées sont parfois reconnues pour empêcher l'injection SQL. Cependant, la plupart du temps, vous devez toujours les appeler en utilisant des paramètres de requête ou ils n'aident pas. Si vous utilisez exclusivement des procédures stockées , vous pouvez désactiver les autorisations pour SELECT, UPDATE, ALTER, CREATE, DELETE, etc. (à peu près tout sauf EXEC) pour le compte d'utilisateur de l'application et obtenir une certaine protection de cette façon.
la source
cmd.Parameters.Add("@Baz", SqlDbType.VarChar, 50).Value = Baz
s'il vous plaît?@Baz
qui est de typevarchar(50)
auquel la valeur de laBaz
chaîne est affectée .AddWithValue("@Baz", Baz)
, vous pouvez le faire, mais vous ne devriez pas , en particulier parce que la conversion des valeurs de chaîne qui correspondent par défaut au typenvarchar
réelvarchar
est l'un des endroits les plus courants qui peuvent déclencher les effets mentionnés dans ce lien.Certainement le dernier, c'est à dire
Les requêtes paramétrées présentent deux avantages principaux:
la source
Vous voulez aller avec votre dernier exemple car c'est le seul qui est vraiment paramétré. Outre les problèmes de sécurité (qui sont beaucoup plus répandus que vous pourriez le penser), il est préférable de laisser ADO.NET gérer le paramétrage car vous ne pouvez pas être sûr si la valeur que vous passez nécessite des guillemets simples autour d'elle ou non sans inspecter le
Type
de chaque paramètre .[Modifier] Voici un exemple:
la source
La plupart des gens le feraient via une bibliothèque de langage de programmation côté serveur, comme PDO de PHP ou Perl DBI.
Par exemple, en AOP:
Cela prend soin d'échapper vos données pour l'insertion de la base de données.
Un avantage est que vous pouvez répéter une insertion plusieurs fois avec une instruction préparée, ce qui vous permet de gagner en vitesse.
Par exemple, dans la requête ci-dessus, je pourrais préparer l'instruction une fois, puis effectuer une boucle sur la création du tableau de données à partir d'un ensemble de données et répéter le -> exécuter autant de fois que nécessaire.
la source
Le texte de votre commande doit être comme:
Ajoutez ensuite les valeurs des paramètres. De cette façon, on s'assure que la valeur con ne sera utilisée que comme valeur, alors qu'avec l'autre méthode si la variable fuz est définie sur
pouvez-vous voir ce qui pourrait arriver?
la source
Voici une courte classe pour commencer avec SQL et vous pouvez construire à partir de là et ajouter à la classe.
MySQL
MS SQL / Express
la source