Page 1 sur 1

problème d'apostrophe dans une requette...

Posté : 15 janv. 2006, 03:09
par Nico128
Salut tout le monde...!

J'ai une requette que voici :
$query1 = "SELECT * FROM fiches_jeux_".$_GET['console']." where titre = '".$titre."'";
$mysql_result = mysql_query($query1, $mysql_link);
	while($row = mysql_fetch_row($mysql_result)) {
        $id_fiche = $row[0];
		$titre_fiche = $row[1]; }
Le problème c'est que si la variable $titre contient un apostrophe ' ca maffiche ce message d'erreur :
Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /home/www/517421f0ca8e8940110726410aa45186/web/fiches-jeux/onglet.php on line 35
Alors je me dit qu'un petit addslashes($titre) devrait surement faire l'affaire mais non, j'obtient ce message d'erreur :
Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /home/www/517421f0ca8e8940110726410aa45186/web/fiches-jeux/onglet.php on line 43

Erreur : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's Mask'' at line 1
Alors que faut-til mette ? Merci d'avance :D

Posté : 15 janv. 2006, 05:52
par DocType
Ca dépend...
Moi par défaut tout ce qui entre en ' " < et > est automatiquement transformé en entité html...ca évite les injections sql, ce dont tu es actuellement victime...
Il convient donc de formater ton champ avant la requête, ce qui signifie transformer les ' en \' ou en entité html.

N'oublie pas que lorsque ton entrée sera comparée, elle comprendra l'antislashe ou l'entité html, il font donc penser à modifier tes données en bdd en conséquence...

Posté : 15 janv. 2006, 10:15
par Cyrano
Autre option possible:
$titre = (!get_magic_quotes_gpc()) ? mysql_escape_string($titre) : $titre;
$query1 = "SELECT * FROM fiches_jeux_".$_GET['console']." where titre = '". $titre ."'";

Posté : 15 janv. 2006, 18:16
par Nico128
N'oublie pas que lorsque ton entrée sera comparée, elle comprendra l'antislashe ou l'entité html, il font donc penser à modifier tes données en bdd en conséquence...
J'ai pas tout compris ça, comparé à quoi ?

Enfaite je sais pas si cest comme ça pour chaque base de donné. Mais quand j'ai enregistrer mon titre dans ma base de donné, jai du rajouter un slash avant l'apostrophe. Par contre dans la base de donné il n'y a pas de slash.

Donc je comprend pas trop pourquoi en remettant un slash ça marche pas...

Cyrano j'ai testé ce que tu ma dit, le message d'erreur est le meme que si je mets le addslash

je vais essayer avec htmlentities

edite:

jai essayé avec le htmlentities :
$titre = htmlentities($titre) ; 
$query1 = "SELECT * FROM fiches_jeux_".$_GET['console']." where titre = '".$titre."'";
et ca me donne :
Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /home/www/517421f0ca8e8940110726410aa45186/web/fiches-jeux/onglet.php on line 36
Je comprend pas pourquoi :?

Posté : 15 janv. 2006, 22:31
par DocType
On va reprendre...
- Si tu as echappé tes ' avec un \, tu dois donc t'amuser à remettre un slash
$titre = addslashes($titre) ;
$query1 = "SELECT * FROM fiches_jeux_".$_GET['console']." where titre = '".$titre."'";
- Si tu veux faire fonctionner correctement un htmlentities, il existe un "manuel php" (si si, je t'assure !). Il nous apprend après avoir recherché cette focntion dans le manuel que "cette fonction prend l'argument optionnel quote_style , qui indique comment doivent être traités les guillemets doubles et simples. Vous pouvez utiliser l'une des constantes suivantes la valeur par défaut étant ENT_COMPAT : Nom Description
ENT_COMPAT Convertit les guillemets doubles, et ignore les guillemets simples
ENT_QUOTES Convertit les guillemets doubles et les guillemets simples
ENT_NOQUOTES Ignore tous les guillemets "
Cela veut dire que dans ton utilisation actuelle, il ne convertit pas les ' mais tout le reste...donc le fonctionnement est "normal". N'hésite pas à visiter le manuel php pour plus d'informations de ce type...

J'aimerais également ajouter que ce type d'utilisation est non securisée actuellement ! A mon avis, vu ta question, aucune donnée entrée en base n'est formatée ni contrôlé. Ton site est donc très largement maîtrisable par n'importe qui de compétent !
Il suffit de regarder la portion "SELECT * FROM fiches_jeux_".$_GET['console']." pour s'en rendre compte

Posté : 15 janv. 2006, 23:28
par Nico128
On va reprendre...
- Si tu as echappé tes ' avec un \, tu dois donc t'amuser à remettre un slash
Justement quand je l'ai ajouter depuis une page, jai mis un slash, par contre dans la base de donné il n'y a pas de slash.
Mets pourquoi quand je mets un addslash() il me vient une erreur de syntaxe ?

Sinon j'ai réussi avec htmlentities a convertir les guillement en html. Là aucun message d'erreur, c'est juste que la il ne me sort aucune réponse. C'est normal parce que dans ma base l'apostropge est enregistré en ' et non en '

Et pour la vulnérabilité, à "SELECT * FROM fiches_jeux_".$_GET['console']." cest a cause du $_GET['console'] que ce nest pas sécurisé ? La personne peux mettre ce qu'il veut, mais il peux pas aller bien loin jai juste 5-6 tables qui commence par fiches_jeux alors qu'est ce qu'il peux faire ?

Posté : 15 janv. 2006, 23:52
par DocType
Sinon j'ai réussi avec htmlentities a convertir les guillement en html. Là aucun message d'erreur, c'est juste que la il ne me sort aucune réponse. C'est normal parce que dans ma base l'apostropge est enregistré en ' et non en '

Et pour la vulnérabilité, à "SELECT * FROM fiches_jeux_".$_GET['console']." cest a cause du $_GET['console'] que ce nest pas sécurisé ? La personne peux mettre ce qu'il veut, mais il peux pas aller bien loin jai juste 5-6 tables qui commence par fiches_jeux alors qu'est ce qu'il peux faire ?
Au contraire...beacoup de choses peuvent être faites à partir de là !
Il convient de TOUJOURS formater les données qui vont en requete sql !
Selon certaines requêtes, on peut même vider ou supprimer les tables...

Pour le addslashes, il serait superbe de nous montrer ton code incluant le addslashes :wink:

Posté : 30 janv. 2006, 14:00
par Nico128
Houla ça faisais un ptit moment que jétait pas venu...désolé.

Alors je reprend : Dans ma base de donné j'ai un enregistrement qui s'apelle
Tests de The Legend Of Zelda : Majora's Mask
On voit qu'il y a une guillement.

Et j'ai une variable $titre qui a exactement la même valeur. Voici le code php :
$query1 = "SELECT * FROM fiches_jeux_".$_GET['console']." where titre = '".$titre."'";
$mysql_result = mysql_query($query1, $mysql_link);
	while($row = mysql_fetch_row($mysql_result)) {
        $id_fiche = $row[0];
		$titre_fiche = $row[1]; }
Donc ma requête donnera comme ça :
query1 = "SELECT * FROM fiches_jeux_".$_GET['console']." where titre = 'Tests de The Legend Of Zelda : Majora's Mask'";
Mais avec l'apostrophe biensur ca créé un problème. J'ai essayé en mettant addslash() et il la il y a un autre message d'erreur. Donc comment faire ?

Aufaite, ca veux dire quoi formater les donné ?

Voilà, merci d'avance :D

Posté : 30 janv. 2006, 14:43
par zeus
Afin de comprendre l'erreur MySQL, je te conseille de l'afficher :
$mysql_result = mysql_query($query1, $mysql_link) or die(mysql_error());


Mais je te conseille tout de même d'utiliser htmlentities ou addslashes pour que ta requête fonctionne

Posté : 30 janv. 2006, 15:46
par Invité
Roo mince ce que je peux etre con...jen reviens pas. Enfaite j'avais déja essayé de mettre un addslashs et justement ça ne marchais pas, et cétait ca que je comprenais pas.

Mais javais pas fait attention que plus bas j'avais aussi une requete avec un apostrophe, et cétait la qu'après venait le message d'erreur -_-

Ah la la...Merci a tous de m'avoir aidé :D

Posté : 30 janv. 2006, 15:47
par Nico128
C'était moi l'invité ci-dessus, désolé j'avais pas vu que j'était pas connecté.