10
votes

L'utilisation de la constitution préparée signifie-t-elle qu'il n'y aura aucune injection SQL?

J'ai lu que pour empêcher l'injection SQL, il faut utiliser une estabilité préparée.
Cela signifie-t-il si j'utilise PerpaDstatement, alors personne ne peut effectuer une injection SQL dans une de mes page? Est-ce pas infaillible contre l'injection SQL? Sinon, veuillez donner un exemple pour démontrer cela.


0 commentaires

5 Réponses :


10
votes

Tant que vous utilisez réellement la fonctionnalité de substitution des paramètres de la déclaration préparée (il est possible de les abuser et non d'utiliser cette fonctionnalité), et à condition qu'il n'y ait pas de bogue dans la bibliothèque de déclaration préparée que vous utilisez, Ensuite, vous devriez être bien contre l'injection SQL brute. Cela ne signifie pas que vous ne devriez pas traiter tout ce que l'utilisateur vous donne des soupçons, cependant. : -)


0 commentaires

2
votes

Bien que des déclarations préparées contribuent à la défense contre l'injection SQL, il existe des possibilités d'attaques d'injection SQL grâce à une utilisation inappropriée des déclarations préparées.

L'exemple ci-dessous explique un tel scénario dans lequel les variables d'entrée sont transmises directement dans la déclaration préparée et ainsi pavé de manière aux attaques d'injection SQL. P>

String strUserName = request.getParameter("Txt_UserName"); 
PreparedStatement prepStmt = con.prepareStatement("SELECT * FROM user WHERE userId = '+strUserName+'");


2 commentaires

Je ne traiterai pas cela comme préparé de manière préparée, même si cela dit Con.PreparationStatement.


@Rakesh: Ouais, mais tu serais surpris ... :-)



3
votes

Utilisation de la fonction d'instruction préparée de la langue fournie signifie que vous utilisez une solution éprouvée pour le problème - cela ne signifie pas qu'il n'y a jamais de bugs ni de possibilités de possibilités d'injection SQL, mais ce que cela signifie que vous ne sont pas la seule personne à l'aide de la mise en œuvre. Plus les personnes utilisent la même mise en œuvre pour quelque chose signifie que plus les chances de trouver des bugs doivent être trouvées et éliminées - si vous utilisez votre propre implémentation, vous seul pouvez trouver et réparer les bugs.


1 commentaires

Alors pourquoi la note négative? Qu'en est-il de ma réponse est fausse ou trompeuse? Le point entier sur l'utilisation d'un cadre est que son utilisation largement utilisée - plus de problèmes à trouver et à fixer, plus de chances que le code que vous consommez via le cadre soit prouvé. Votre propre code ne peut jamais être prouvé par vous-même et vous êtes donc désavantagé que par rapport aux autres implémentations. Alors qu'est-ce qui ne va pas avec ma position?



4
votes

Les énoncés préparés ne couvrent pas les parties non-données des interrogations et des opérateurs.
Ainsi, si certains d'entre eux sont variables et que d'être ajoutés à la requête directement, l'injection est possible.

Grâce au nombre limité d'options possibles, tous les identificateurs variables doivent être choisis parmi des variantes pré-écrites en fonction de la saisie de l'utilisateur. idem pour les opérateurs.
Aucune entrée d'utilisateur ne doit être ajoutée à la requête directement.


0 commentaires

2
votes

Réponse courte: Oui, si utilisé correctement.

Cependant, cela ne signifie pas qu'il ne peut y avoir de bugs dans le pilote JDBC, ouvrant l'injection SQL. Lorsque j'ai examiné cela pour une entreprise, j'ai travaillé, j'ai trouvé qu'il y avait bien un bogue d'injection SQL dans l'un des pilotes JDBC que nous avons utilisés (PostgreSQL). Cela il y a quelques années et le bogue a été corrigé.

Bien que je ne me souvienne pas des détails, je me souviens de regarder le code source d'une implémentation JDBC et de constater qu'il a été mis en œuvre avec la concaténation de chaînes.

Je m'attendrais à ce que cela soit rare, cependant, et mes conseils seraient nécessaires pour faire confiance à la mise en œuvre et utiliser correctement la mise en œuvre.


0 commentaires