Quand est-il sûr d'utiliser des variables non paramétrés dans les commandes SQL?

StackOverflow https://stackoverflow.com/questions/929873

  •  06-09-2019
  •  | 
  •  

Question

J'écris une requête de sélection dans une méthode C # qui permet de code client fournir un ID de ligne et récupérer un objet construit à partir des données de la ligne. Si l'ID de ligne est un entier et je l'ai confirmé qu'il est positif, est-il de mal à passer à travers tout en utilisant string.Format? Je ne vois pas comment tout dommage pourrait se faire si elles étaient autorisées à passer un entier et non une chaîne.

Était-ce utile?

La solution

Vous avez raison, il serait prudent de passer un entier de cette façon. Cependant, il y a aussi un autre aspect de l'histoire.

Alors qu'il peut être considéré comme sûr à formater juste un int un créer l'expression SQL, il y a aussi une considération de la performance. Lorsque le serveur SQL voit une requête pour la première fois, il va créer et mettre en cache le plan d'exécution pour cette requête. La prochaine fois que la même requête est émise, le plan d'exécution sera réutilisé.

Si vous passez dans les chaînes différentes, il sera considéré comme des requêtes distinctes, nécessitant des plans d'exécution séparés. Si vous passez dans la même requête paramétrés à chaque fois (avec des paramètres différents), le premier plan d'exécution sera réutilisée par SQL Server.

Même si vous ne se soucient pas de l'avantage de la performance, je continue à utiliser une requête paramétrées pour toutes les requêtes contre la base de données, même pour ceux qui peuvent être considérés comme « sûrs » comme vous le dites - simplement être cohérent dans la façon dont l'application accède à des données. Si vous toujours utiliser la requête paramétrées, il vous permet aussi d'économiser la peine de déterminer si la requête est sûr à chaque fois afin de décider de quelle manière d'interroger la base de données.

Autres conseils

Vous répondre à votre propre question ici. System.Int32 ne peut pas contenir

';DROP DATABASE xxx;--

Si c'est ce que vous êtes inquiet au sujet. Même le passage d'un entier négatif ne serait pas un impact négatif sur votre base de données!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top