Prévention des attaques par injection SQL dans un programme Java
J'ai du ajouter une déclaration à mon programme java pour mettre à jour une table de base de données:
String insert =
"INSERT INTO customer(name,address,email) VALUES('" + name + "','" + addre + "','" + email + "');";
J'ai entendu dire que cela peut être exploité grâce à une injection SQL comme:
DROP TABLE customer;
Mon programme a une IHM Java et tous les nom, adresse e-mail et les valeurs sont récupérées à partir de Jtextfields
. Je veux savoir comment le code suivant (DROP TABLE customer;
) pourrait être ajouté à mon insert par un hacker et comment je peux l'en empêcher.
source d'informationauteur Grant
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser PreparedStatement.
par exemple,
Cela permettra d'éviter les attaques par injection.
La façon dont le hacker met en il y a si la Chaîne que vous insérez est venu à partir d'une entrée quelque part - par exemple, un champ de saisie sur une page web, ou un champ de saisie dans un formulaire dans une application ou similaire.
Par exemple:
donnerait cette valeur dans insérer:
Utiliser des requêtes préparées et SQL arguments (par exemple "volé" de Matt Boursiers):
Également analyser les valeurs que vous avez sur ces variables, et assurez-vous qu'ils ne contiennent pas non caractères autorisés (tels que le ";" dans un nom).
Vous pouvez vérifier CETTE article pour plus d'informations sur ce! 🙂
Je recommande les Requêtes Paramétrées:
Un attaquant a juste à taper quelque chose comme
'[email protected]"); DROP TABLE customer;
dans le domaine deemail
et vous avez terminé.Vous pouvez éviter cela en utilisant le bon s'échapper pour JDBC Consolidés.
C'est pourquoi vous devez utiliser un point d'interrogation dans votre chaîne de déclarations:
cité de ici
Comme expliqué dans ce postle
PreparedStatement
seul ne peut pas vous aider si vous avez encore de la concaténation de Chaînes.Par exemple, un voleur attaquant peut toujours faire ce qui suit:
Ça ne vient pas de SQL, mais JPQL et HQL peut être compromise si vous n'êtes pas à l'aide de lier des paramètres:
Ligne de fond, vous ne devez jamais utiliser la concaténation de chaîne lors de la construction d'instructions SQL. L'utilisation d'une API dédiée à cet effet:
Aller pour PreparedStatement
Les avantages d'un PreparedStatement:
Précompilation et DB la mise en cache côté de l'instruction SQL conduit à l'ensemble de la rapidité d'exécution et la possibilité de réutiliser la même instruction SQL dans les lots.
Automatique de la prévention des attaques par injection SQL par builtin échapper à des citations et autres caractères spéciaux. Notez que cette fonction nécessite que vous utilisez l'un des PreparedStatement setXxx() les méthodes pour définir la valeur