J'écris une requête select dans une méthode C# qui permet au code client de fournir un identifiant de ligne et de récupérer un objet construit à partir des données de la ligne. Si l'ID de ligne est un entier et que j'ai confirmé qu'il est positif, y a-t-il un inconvénient à le faire en utilisant simplement string.Format? Je ne vois pas comment tout dommage pourrait être fait s'ils ne pouvaient passer qu'un int et pas une chaîne.Quand est-il sécuritaire d'utiliser des variables non paramétrées dans les commandes SQL?
Répondre
Vous avez raison, il serait prudent de passer un nombre entier de cette façon. Cependant, il y a aussi un autre aspect de l'histoire.
Bien qu'il puisse être considéré comme sûr de mettre en forme un entier et de créer l'expression SQL, il existe également une considération de performance. Lorsque le serveur SQL voit une requête pour la première fois, il crée et met en cache le plan d'exécution de 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 des chaînes différentes, elles seront considérées comme des requêtes distinctes, nécessitant des plans d'exécution distincts. Si vous transmettez la même requête paramétrée à chaque fois (avec des paramètres différents), le premier plan d'exécution sera réutilisé par SQL Server.
Même si vous ne vous souciez pas de l'avantage de performances, j'utiliserais toujours une requête paramétrée pour toutes les requêtes sur la base de données, même pour celles qui peuvent être considérées comme "sûres" comme vous l'avez fait remarquer. la façon dont l'application accède aux données. Si vous utilisez utilisez la requête paramétrée, cela vous évite également de déterminer si la requête est sûre à chaque fois afin de décider de quelle manière interroger la base de données.
Vous répondez à votre propre question ici. System.Int32 ne peut pas contenir
';DROP DATABASE xxx;--
Si c'est ce qui vous inquiète. Même le passage d'un entier négatif n'aurait pas d'impact négatif sur votre base de données!
D'accord. Je suis relativement nouveau à ce sujet et entièrement autodidacte sur les bases de données (ne vous inquiétez pas du monde, j'ai appris toutes les 6 formes normales), donc j'étais inquiet il y avait un truc connu où passer un certain nombre pourrait faire des ravages. – ehdv
Je serais prudent de passer 666. Stuff comme ça est mieux gardé secret! ;-) – Andomar
- 1. assemblage non sécuritaire à la production dans SQL Server 2005
- 2. Est-ce que SqlCommand optimise les instructions sql paramétrées?
- 3. Requêtes paramétrées SANS les procédures stockées?
- 4. Variables en tant que commandes dans les scripts bash
- 5. Classement des commandes - Méthode d'extension non-allumage!
- 6. Comment placer des valeurs dans des commandes SQL?
- 7. BASH Variables avec plusieurs commandes et réentrantes
- 8. Quand les variables doivent-elles être définies dans une classe
- 9. Commandes non actualisées dans ASP.net MVC
- 10. Commandes de .bashrc non disponible dans Emacs
- 11. LINQ à des variables de débogage SQL
- 12. paramétrées expression régulière en Python
- 13. Les vues ASP.NET MVC doivent-elles être paramétrées
- 14. Variables non initialisées dans Fortran 2003
- 15. C# Non Éliminer les commandes comme je l'ai indiqué à
- 16. Quand les variables de classe sont-elles chargées?
- 17. sql variables
- 18. variables à l'intérieur des variables
- 19. Quand les variables d'instance Ruby sont-elles définies?
- 20. SQL sachant quand diviser des tables
- 21. Modification des valeurs des variables dans les méthodes, Java
- 22. Requêtes paramétrées SubSonic 3 et Linq
- 23. Comment utiliser les variables dans l'instruction SQL en Python?
- 24. Les valeurs réelles sont-elles triées différemment des variables flottantes dans les requêtes SQL Server?
- 25. Dans ObjectiveC, les pointeurs sont-ils des variables d'instance de classe initialisées à 'nil' ou non?
- 26. Mauvaise gestion des variables de sessions PHP?
- 27. Prism - Commandes non mise à feu
- 28. Regex pour trouver des variables statiques (non finales)
- 29. Quelles commandes ASP.NET peuvent entraîner un code non sécurisé?
- 30. Utilisation de variables variables PHP dans une requête SQL
+1 - L'avantage des performances résultant du paramétrage correct des requêtes signifie qu'il n'est pas très logique de ne PAS les paramétrer, jamais. Le paramétrage n'est pas seulement pour la prévention de l'injection SQL. –
+1 - le modèle cohérent consiste à utiliser des arguments de liaison. nous le faisons même dans le cas «sûr» d'un entier unique, parce que cela suit le même schéma que nous suivons dans des cas plus complexes. (l'analyse stricte d'une instruction unique n'aura pas beaucoup d'impact sur la performance d'une seule instruction, ce sont les milliers d'analyses par seconde qui ont un impact sur l'extensibilité) – spencer7593