Empêcher les attaques par injection SQL dans un programme Java


Je dois ajouter une instruction à 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é via une injection SQL comme:

DROP TABLE customer; 

Mon programme a une interface graphique Java et toutes les valeurs de nom, d'adresse et d'email sont récupérées à partir de Jtextfields. Je veux savoir comment le code suivant (DROP TABLE customer;) pourrait être ajouté à ma déclaration insert par un pirate informatique et comment je peux empêcher cela.

Author: Grant, 2012-03-01

7 answers

, Vous devez utiliser PreparedStatement. par exemple

String insert = "INSERT INTO customer(name,address,email) VALUES(?, ?, ?);";
PreparedStatement ps = connection.prepareStatement(insert);
ps.setString(1, name);
ps.setString(2, addre);
ps.setString(3, email);

ResultSet rs = ps.executeQuery();

Cela empêchera les attaques par injection.

La façon dont le pirate l'insère est si la chaîne que vous insérez provient d'une entrée quelque part - par exemple un champ de saisie sur une page Web, ou un champ de saisie sur un formulaire dans une application ou similaire.

 20
Author: Matt Fellows, 2014-02-27 08:04:21

Je veux savoir comment ce genre de code("DROP TABLE customer;") peut être ajouté à ma déclaration d'insertion par un pirate

Par exemple:

name = "'); DROP TABLE customer; --"

Donnerait cette valeur dans {insérer[11]}:

INSERT INTO customer(name,address,email)     VALUES(''); DROP TABLE customer; --"','"+addre+"','"+email+"');

Je veux spécialement savoir comment puis-je empêcher cela

Utilisez des instructions préparées et des arguments SQL (exemple "volé" de Matt Fellows):

String insert = "INSERT INTO customer(name,address,email) VALUES(?, ?, ?);";
PreparedStament ps = connection.prepareStatment(insert);

Analysez également les valeurs que vous avez sur de telles variables et assurez-vous qu'elles ne le font pas contient des caractères non autorisés (tels que ";" dans un nom).

 12
Author: m0skit0, 2012-03-01 13:06:37

Vous pouvez vérifier CET article pour plus d'informations à ce sujet! :)

Je recommande les Requêtes Paramétrées:

String selectStatement = "SELECT * FROM User WHERE userId = ? ";
PreparedStatement prepStmt = con.prepareStatement(selectStatement);
prepStmt.setString(1, userId);
ResultSet rs = prepStmt.executeQuery();
 7
Author: aF., 2012-03-01 12:58:55

Un attaquant doit juste entrer quelque chose comme '[email protected]"); DROP TABLE customer; dans le champ pour email et vous avez terminé.

Vous pouvez empêcher cela en utilisant l'échappement approprié pour les instructions JDBC.

 5
Author: , 2012-03-01 13:00:00

C'est pourquoi vous devriez utiliser des points d'interrogation dans vos instructions de chaîne:

 PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
                                     SET SALARY = ? WHERE ID = ?");
   pstmt.setBigDecimal(1, 153833.00)
   pstmt.setInt(2, 110592)

Cité de ici

 2
Author: dimitrisli, 2012-03-01 13:00:36

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

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

Et ce n'est pas seulement SQL, mais JPQL et HQL peuvent être compromis si vous n'utilisez pas les paramètres de liaison:

PreparedStatement ps = connection.prepareStatement(
    INSERT INTO customer(name,address,email) VALUES(?, ?, ?)
);
int index = 0;
ps.setString(++index, name);
ps.setString(++index, address);
ps.setString(++index, email);

ResultSet rs = ps.executeQuery();

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

 1
Author: Vlad Mihalcea, 2018-01-05 17:37:20

Allez pour PreparedStatement Avantages d'une déclaration préparée:

La précompilation et la mise en cache côté base de données de l'instruction SQL entraînent une exécution globalement plus rapide et la possibilité de réutiliser la même instruction SQL par lots.

Prévention automatique des attaques par injection SQL par échappement intégré des guillemets et autres caractères spéciaux. Notez que cela nécessite que vous utilisiez l'une des méthodes PreparedStatement setXxx () pour définir la valeur

 0
Author: Mukesh Kumar, 2015-11-18 11:32:51