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?
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 .
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.
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:
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:
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.