web-dev-qa-db-fra.com

L'élément prepareStatement évite-t-il l'injection SQL?

J'ai lu et essayé d'injecter des requêtes SQL vulnérables à mon application. Ce n'est pas assez sûr. J'utilise simplement la connexion de déclaration pour les validations de base de données et d'autres opérations d'insertion.

Les déclarations préparées sont-elles sûres? et en plus y aura-t-il un problème avec cette déclaration aussi?

35
Mohamed Saligh

L'utilisation de la concaténation de chaînes pour construire votre requête à partir d'une entrée arbitraire ne rendra pas PreparedStatement sûr. Jetez un œil à cet exemple:

preparedStatement = "SELECT * FROM users WHERE name = '" + userName + "';";

Si quelqu'un met

' or '1'='1

en tant que userName, votre PreparedStatement sera vulnérable à l'injection SQL, car cette requête sera exécutée sur la base de données en tant que

SELECT * FROM users WHERE name = '' OR '1'='1';

Donc, si vous utilisez

preparedStatement = "SELECT * FROM users WHERE name = ?";
preparedStatement.setString(1, userName);

vous serez en sécurité.

Une partie de ce code tiré de cet article Wikipedia .

56
darioo

L'instruction préparée, si elle est utilisée correctement, protège contre l'injection SQL. Mais veuillez poster un exemple de code à votre question, afin que nous puissions voir si vous l'utilisez correctement.

2
pts

Comme expliqué dans cet article , le PreparedStatement seul ne vous aide pas si vous concaténez toujours des chaînes.

Par exemple, un attaquant non autorisé peut toujours effectuer les opérations suivantes:

  • appeler une fonction de veille afin que toutes vos connexions à la base de données soient occupées, rendant ainsi votre application indisponible
  • extraire des données sensibles de la base de données
  • contournant l'authentification de l'utilisateur

Et ce n'est pas seulement SQL qui peut être affecté. Même JPQL peut être compromis si vous n'utilisez pas de paramètres de liaison.

En fin de compte, vous ne devez jamais utiliser la concaténation de chaînes lors de la création d'instructions SQL. Utilisez une API dédiée à cet effet:

1
Vlad Mihalcea

Eh bien, simplement utiliser PreparedStatement ne vous met pas en sécurité. Vous devez utiliser des paramètres dans votre requête SQL ce qui est possible avec PreparedStatement. Regardez ici pour plus d'informations.

1
Petar Minchev