en fait ce que tu ne comprend pas c'est la différence entre ta chaine de caractère et le contenu de la variable. Et donc au final l'endroit ou l'erreur va se passer
Une chaine de caractère doit être délimiter par des " ou des ' (ça tu le sais déja).
lorsque l'on souhaite utiliser des " ou des ' dans une chaine de caractère il faut échapper celui qui correspond à ce qui sert à "encapsuler" la chaine (ce que tu fait dans ton exemple) donc avec echo 'je l'aime'; (oui c'est la st valentin ^^) tu aura une parse error que tu n'aura pas avec echo 'je l\'aime';
maintenant si je fait
<?php
$x = 'je joue avec les guillements la " et la " voir même ici " ;)';
echo "j'inclue le tous dans un echo : $x | et je peut mettre des truc après si veut !";
?>
la il n'y a aucun problème le texte va s'afficher sans parse error. Pourquoi ? parce que mes chaines sont correctement formée indépendamment des ' ou "
Qu'est ce qu'une faille SQL ?
ben vulgairement parlant c'est un truc qui détourne l'utilisation normale d'une requete, parce que tu l'a laisser faire (sisi le truc ne fait que ce que tu lui dit et si tu lui dit de faire mal il le fera

).
exemple
$requete = 'select count(id) from user where login=\'$x\'';
cette requête parait banal, on se dit tiens il veut savoir si le mec existe dans la base. Effectifvement, mais ça c'est penser au petit malin qui rentrera dans le beaux formulaire avec le titre ADMINISTRATION de ton site le pseudo ' or 1=1 limit 1 !
dans ce cas la requête c'est quoi ?
si tu te souvient de ce que j'ai dit la chaine de caractère
PHP sera bien formée car le fait qu'il y ait une ' dans la valeur fournie ne le dérange pas puisse que l'on "n'interfère" pas dans les délimiteurs on va donc avoir dans la variable :
select count(id) from user where login='' or 1=1 limit 1 !
/!\ je n'ai pas mis les ' car je te montre le contenu de la variable c'est dire ce qui sera utile les ' n'étant la que pour dire la où commence et où finis la chaine de caractère.
Donc tu peut voir qu'au final ou va envoyer à mysql un requête SQL, elle aussi, syntaxiquement correcte mais on vos la faille de sécurit. Non ?
aller je t'aide
- select count(id) from user : je compte tout les id de la table user
- where login ='' : je compte tout les id de la table user qui ont un champ login vide (attention pas null vide)
- or 1=1 : ou 1=1 O_o ben oui 1 = 1 cette condition
est toujours vrai donc au final login='' or 1=1
sera toujours VRAI je valide donc la clause where je compte l'id
- limit 1 : alors astuce, je m'dit le dev est pas trop couillon il à mis ensuite dans son code une vérification du nombre de tuple pour le cas où et il vérifie == 1 et pas >=0 (mais bon la p lus part du temps c'est pas le cas

).
donc je vais toujours sélectionner 1 comme résultat du count.
je vais plus loin si j'ajoute un order by id asc (au pif mais les 3/4 des clefs primaire se nomme id au pire tu aura une erreur sql qui va t'aider à pourrir le site

). Avec mon order by je vais selectionner le 1er tuple de la table, si je m'en sert pour une connection se sera le premier utilisateur de la table qui est .......... en général l'administrateur du site (quand tu installe n'importe qu'elle appli c'est la première chose que tu entre) et la c'est le drame, le mec fait ce qu'il veut de ton site =D>
maintenant si tu utilise mysql_real_escape_string tu évite ce problème. Pourquoi ? parce que cette fonction va ajouter un \ devant 'est rendre la requete différente :
select count(id) from user where login='\' or 1=1 limit 1'
la tu va chercher l'utilisateur qui a pour login ' or 1=1 limit 1 (quote comprise) et ça c'est pas banal
pourquoi tous ce paté ?
Pour te montrer qu'il faut différencier les chaines de caractère PHP et SQL et te montre que ce qui est syntaxiquement correct pour l'un ne le sera pas pour l'autre et surtout peut l'être mais induire une faille de sécurité.
Mais aussi te montrer qu'elles sont indépendante et que former une chaine php syntaxiquement correcte n'inclue pas une chaine correcte et sécurisé pour SQL
pourquoi j'utilise des ' et pas des " dans mes requetes ? parce que de mémoire la syntaxe de la ref SQL mais ça ne pose pas de problème à mysql (ça serait le cas avec d'autre comme sqlserver et la ton code n'est pas portable

).
pour la formation des chaines php tu peut aussi utiliser la syntaxe
pour t'affranchir des ' et " coté php mais il faudra quand même les gérer pour MySQL.
tu peut aussi regardé du coté de l'extension mysqli et l'extension montante [url=http://www.siteduzero.com/tutoriel-3-34 ... x-bdd.html]PDO (article sur le SdZ).
J'espère que c'était pas trop barbant et que t'a compris ce que j'ai mis
@+
en fait ce que tu ne comprend pas c'est la différence entre ta chaine de caractère et le contenu de la variable. Et donc au final l'endroit ou l'erreur va se passer :)
Une chaine de caractère doit être délimiter par des " ou des ' (ça tu le sais déja).
lorsque l'on souhaite utiliser des " ou des ' dans une chaine de caractère il faut échapper celui qui correspond à ce qui sert à "encapsuler" la chaine (ce que tu fait dans ton exemple) donc avec echo 'je l'aime'; (oui c'est la st valentin ^^) tu aura une parse error que tu n'aura pas avec echo 'je l\'aime';
maintenant si je fait
[php]
<?php
$x = 'je joue avec les guillements la " et la " voir même ici " ;)';
echo "j'inclue le tous dans un echo : $x | et je peut mettre des truc après si veut !";
?>[/php]
la il n'y a aucun problème le texte va s'afficher sans parse error. Pourquoi ? parce que mes chaines sont correctement formée indépendamment des ' ou "
Qu'est ce qu'une faille SQL ?
ben vulgairement parlant c'est un truc qui détourne l'utilisation normale d'une requete, parce que tu l'a laisser faire (sisi le truc ne fait que ce que tu lui dit et si tu lui dit de faire mal il le fera ;)).
exemple
$requete = 'select count(id) from user where login=\'$x\'';
cette requête parait banal, on se dit tiens il veut savoir si le mec existe dans la base. Effectifvement, mais ça c'est penser au petit malin qui rentrera dans le beaux formulaire avec le titre ADMINISTRATION de ton site le pseudo ' or 1=1 limit 1 !
dans ce cas la requête c'est quoi ?
si tu te souvient de ce que j'ai dit la chaine de caractère [b]PHP[/b] sera bien formée car le fait qu'il y ait une ' dans la valeur fournie ne le dérange pas puisse que l'on "n'interfère" pas dans les délimiteurs on va donc avoir dans la variable :
[sql]select count(id) from user where login='' or 1=1 limit 1 ![/sql]
/!\ je n'ai pas mis les ' car je te montre le contenu de la variable c'est dire ce qui sera utile les ' n'étant la que pour dire la où commence et où finis la chaine de caractère.
Donc tu peut voir qu'au final ou va envoyer à mysql un requête SQL, elle aussi, syntaxiquement correcte mais on vos la faille de sécurit. Non ?
aller je t'aide
- select count(id) from user : je compte tout les id de la table user
- where login ='' : je compte tout les id de la table user qui ont un champ login vide (attention pas null vide)
- or 1=1 : ou 1=1 O_o ben oui 1 = 1 cette condition [b]est toujours vrai[/b] donc au final login='' or 1=1 [b]sera toujours VRAI[/b] je valide donc la clause where je compte l'id
- limit 1 : alors astuce, je m'dit le dev est pas trop couillon il à mis ensuite dans son code une vérification du nombre de tuple pour le cas où et il vérifie == 1 et pas >=0 (mais bon la p lus part du temps c'est pas le cas ;) ).
donc je vais toujours sélectionner 1 comme résultat du count.
je vais plus loin si j'ajoute un order by id asc (au pif mais les 3/4 des clefs primaire se nomme id au pire tu aura une erreur sql qui va t'aider à pourrir le site ;)). Avec mon order by je vais selectionner le 1er tuple de la table, si je m'en sert pour une connection se sera le premier utilisateur de la table qui est .......... en général l'administrateur du site (quand tu installe n'importe qu'elle appli c'est la première chose que tu entre) et la c'est le drame, le mec fait ce qu'il veut de ton site =D>
maintenant si tu utilise mysql_real_escape_string tu évite ce problème. Pourquoi ? parce que cette fonction va ajouter un \ devant 'est rendre la requete différente : [sql]select count(id) from user where login='\' or 1=1 limit 1' [/sql]
la tu va chercher l'utilisateur qui a pour login ' or 1=1 limit 1 (quote comprise) et ça c'est pas banal :)
pourquoi tous ce paté ?
Pour te montrer qu'il faut différencier les chaines de caractère PHP et SQL et te montre que ce qui est syntaxiquement correct pour l'un ne le sera pas pour l'autre et surtout peut l'être mais induire une faille de sécurité.
Mais aussi te montrer qu'elles sont indépendante et que former une chaine php syntaxiquement correcte n'inclue pas une chaine correcte et sécurisé pour SQL :-)
pourquoi j'utilise des ' et pas des " dans mes requetes ? parce que de mémoire la syntaxe de la ref SQL mais ça ne pose pas de problème à mysql (ça serait le cas avec d'autre comme sqlserver et la ton code n'est pas portable ;)).
pour la formation des chaines php tu peut aussi utiliser la syntaxe [url=http://www.php.net/heredoc[/url] pour t'affranchir des ' et " [b]coté php[/b] mais il faudra quand même les gérer pour MySQL.
tu peut aussi regardé du coté de l'extension mysqli et l'extension montante [url=http://www.siteduzero.com/tutoriel-3-34790-pdo-interface-d-acces-aux-bdd.html]PDO[/url] (article sur le SdZ).
J'espère que c'était pas trop barbant et que t'a compris ce que j'ai mis :)
@+