JDBC
seif_29
Messages postés
4
Date d'inscription
Statut
Membre
Dernière intervention
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
J'ai un petit problème avec la requête select contient "and" (JDBC) ... même si la condition est vrai et existe dans la base elle me retourne 0 !!!
J'ai un petit problème avec la requête select contient "and" (JDBC) ... même si la condition est vrai et existe dans la base elle me retourne 0 !!!
Statement state_4 = db_biblioConnection.getInstance().createStatement(); ResultSet result_4 = state_4.executeQuery("SELECT count(*) as nbre FROM emprunt where" + " cde_li = '" + code_liv + " and cin_e = " + code_etud + "';"); int exist = 0; while(result_4.next()){ exist = (result_4.getInt("nbre")); } System.out.println(exist);
3 réponses
Je rejoins l'avis de Polux31, il manque des apostrophes :
Cependant il ne faut pas faire ce genre de code, car ce n'est pas du tout sûr !
Voici par exemple ce qu'il est possible de faire :
Cela va donner la requête suivante :
La requête ne respecte pas la syntaxe SQL à cause des mauvaises ouvertures et fermetures des chaines de caractères. Cela va donc te générer une exception et planter ton programme.
Plus dramatique, on pourrait faire quelque chose comme ceci :
Cela reviendrait à faire ces commandes SQL :
La deuxième commande va totalement effacer ta base de donnée, c'est une énorme faille de sécurité de ton programme ! On appelle ça de l'injection SQL.
Lorsque ta commande SQL prend des paramètres, comme ici, il faut utiliser des PreparedStatement pour te prémunir contre ce genre de problème. Exemple :
La confiance n'exclut pas le contrôle
" cde_li = '" + code_liv + "' and cin_e = '" + code_etud + "';"
Cependant il ne faut pas faire ce genre de code, car ce n'est pas du tout sûr !
Voici par exemple ce qu'il est possible de faire :
String cde_li = "aujourd'hui", cin_e ="";
Cela va donner la requête suivante :
SELECT count(*) as nbre FROM emprunt where cde_li = 'aujourd'hui' and cin_e = '';
La requête ne respecte pas la syntaxe SQL à cause des mauvaises ouvertures et fermetures des chaines de caractères. Cela va donc te générer une exception et planter ton programme.
Plus dramatique, on pourrait faire quelque chose comme ceci :
String cde_li = "'; DROP DATABASE database; --", cin_e ="";
Cela reviendrait à faire ces commandes SQL :
SELECT count(*) as nbre FROM emprunt where cde_li = ''; DROP DATABASE database; --' and cin_e = '';
La deuxième commande va totalement effacer ta base de donnée, c'est une énorme faille de sécurité de ton programme ! On appelle ça de l'injection SQL.
Lorsque ta commande SQL prend des paramètres, comme ici, il faut utiliser des PreparedStatement pour te prémunir contre ce genre de problème. Exemple :
Connection con = db_biblioConnection.getInstance(); PreparedStatement stmt = con.prepareStatement( "SELECT count(*) as nbre FROM emprunt where cde_li = ? and cin_e = ?"); stmt.setString(1, cde_li); stmt.setString(2, cin_e); ResultSet result_4 = stmt.executeQuery();
La confiance n'exclut pas le contrôle