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

Eléphant du PHP | 246 Messages

15 janv. 2006, 03:09

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

Mammouth du PHP | 1776 Messages

15 janv. 2006, 05:52

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...

Mammouth du PHP | 19672 Messages

15 janv. 2006, 10:15

Autre option possible:
$titre = (!get_magic_quotes_gpc()) ? mysql_escape_string($titre) : $titre;
$query1 = "SELECT * FROM fiches_jeux_".$_GET['console']." where titre = '". $titre ."'";
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 246 Messages

15 janv. 2006, 18:16

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 :?

Mammouth du PHP | 1776 Messages

15 janv. 2006, 22:31

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

Eléphant du PHP | 246 Messages

15 janv. 2006, 23:28

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 ?

Mammouth du PHP | 1776 Messages

15 janv. 2006, 23:52

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:

Eléphant du PHP | 246 Messages

30 janv. 2006, 14:00

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

30 janv. 2006, 14:43

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
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Invité
Invité n'ayant pas de compte PHPfrance

30 janv. 2006, 15:46

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

Eléphant du PHP | 246 Messages

30 janv. 2006, 15:47

C'était moi l'invité ci-dessus, désolé j'avais pas vu que j'était pas connecté.