Des injections SQL avec des requêtes préparées?
Si je me souviens bien, je pense que Jeff est mentionné dans le Débordement de la Pile podcast peut-être une faiblesse dans SQL préparées. Je me demandais quel genre(s) faiblesse(s) fait-il référence? C'était peut-être juste au sujet de un usage inapproprié de celle-ci, ou quelque chose de plus sinistre?
Le podcast, à mon souvenir, n'est-ce pas aller plus loin dans le sujet, c'était juste un passe-par-remarque.
OriginalL'auteur Henrik Paul | 2009-03-24
Vous devez vous connecter pour publier un commentaire.
Je pense que ce qu'il dit c'est que, lorsque vous utilisez les requêtes Préparées, SQL server peut mettre en cache votre plan d'exécution de requête, de sorte que, même si vous modifiez certains paramètres sur l'exécution de la requête, le serveur peut choisir le mauvais (probablement mis en cache) plan d'exécution qui serait effectuer très mal.
Il a également mentionné une nouvelle fonctionnalité de SQL Server 2008 pour forcer le moteur à ré-évaluer les plans d'exécution qu'il a utilisé pour remédier à cette situation.
Avec des Déclarations Préparées à l'avance, le seul problème que j'ai c'est ce. Considérons le Code Java suivant:
Que vous pouvez attendre ici, si vous avez un index sur la table(nom) il sera utilisé par le plan de requête. Eh bien, il ne sera pas. Parce que PraparedStatement doit précompiler et s'attendre au pire: '%MODÈLE%", par exemple. Donc, il ne sera pas optimiser. Il m'a fallu un certain temps pour comprendre ça. Il était à l'origine de ma base de données à souffrir. 🙁
Espère que cela aide.
OriginalL'auteur Pablo Santa Cruz
Au-delà de la normale injection sql (ce qu'on pourrait appeler de premier ordre) attaque il y a du secondaire. Par exemple, il n'est pas inhabituel d'avoir des procédures stockées utiliser la concaténation de chaîne pour créer une requête à laquelle il exécute alors. Si le résultat de récupéré les valeurs de champ sont inclus dans une telle concaténation puis il y a un danger d'injection.
OriginalL'auteur AnthonyWJones
Si la déclaration qui a préparé les paramètres construit dynamiquement en aucune façon, alors que serait plus que probablement être la source de la faiblesse.
Si vous utilisez une bonne base de données de la bibliothèque avec testé des classes pour définir les paramètres, alors vous n'avez pas à vous ouvrir à une injection SQL à tout moment de l'instruction préparée ou pas.
Rappelez-vous, juste parce qu'une déclaration préparée, ou parce que vous êtes à l'aide d'une procédure stockée, cela ne signifie pas que vous êtes protégé contre les attaques par injection. C'est seulement lorsque vous utilisez un fournisseur de base de données de code qui va désinfecter l'entrée de paramètres (ainsi que de l'appliquer à tous les paramètres qui peuvent être utilisés) que vous obtenez une protection contre l'injection SQL.
OriginalL'auteur casperOne
Je n'ai pas encore écouté le podcast, mais dans mon expérience, bon vient de déclarations préparées à l'avance. Souvent, elle améliore les performances de l'application et empêche l'injection SQL (si utilisé correctement, pas comme le deuxième exemple de votre lien).
OriginalL'auteur Björn