JDBC

Fermé
seif_29 Messages postés 4 Date d'inscription vendredi 20 décembre 2013 Statut Membre Dernière intervention 4 mai 2014 - 18 janv. 2014 à 01:57
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 18 janv. 2014 à 11:32
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 !!!

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

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
Modifié par KX le 18/01/2014 à 11:34
Je rejoins l'avis de Polux31, il manque des apostrophes :

" 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
3
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
18 janv. 2014 à 09:57
Bonjour,

Soit il manque des côtes, soit il y en a en trop !!!

Quel type ont les champs cde_li et cin_e ?
0
arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
18 janv. 2014 à 11:10
Et la requête exécutée à la ,main elle retourne quoi?
0