Les antislash sont bien rajouté. mais mysql fait lui aussi des traitements sur les chaines de caractères qu'il reçoit. Grâce au magic_quotes_gpc, la requête que j'avais mis en exemple plus haut à partir de la tienne devient celle ci :
SELECT * FROM table WHERE login='toto\' or 1=\'1'
Pour mysql, " \' " veut dire que le ' après "toto" et celui avant le dernier 1 n'indique pas la fin de la chaine qui commence par un ' mais qu'il est un caractère ' sans signification particulière.
On appelle ça échapper un caractère (faire précéder le caractère par un autre caractère, dans le cas présent l'antislash, pour enlever sa signification spéciale).
Grâce à ce principe, on peut mettre des ' dans une chaine qui commence par un ' et des " dan une chaine qui commence par un ". C'est le même système que pour le code php en fait.
Pour en revenir à cette requête, on a donc :
- magic_quotes_gpc qui rajoute les \ sans que tu le saches
- mysql qui comprend que \ suivit d'un caractère = le caractère
Ces deux effets s'annulent donc et les données inséré dans la table sont identique à ce qui est saisie par le visiteur.
Les inconvénients du magic_quotes_gpc, c'est que
1) tu te rends pas compte de ce comportement de mysql et tu risques de te faire avoir quand tu récupères des données venus d'ailleurs (un fichier texte, ton propre code, des données retourné par une requête SQL, ...)
2) si tu affiches le texte saisie dans la nouvelle page, tu auras des slash qui vont se rajouter sans arrêt. C'est gênant si tu fais, par exemple, un formulaire dans lequel on saisie son pseudo, son mot de passe et un message. Celui qui se trompe devra corriger le texte de son message à chaque tentative.
3) comme dit plus haut, ça ne protège pas complètement les bases de données.
Il y a déjà eu plusieurs discutions sur le forum où on a donné le code qui permet de détecter et neutraliser le magic_quotes_gpc . Ensuite on peut travailler l'esprit tranquille en appliquant les bonnes protections en fonction de ce qu'on en fait (affichage dans la page avec htmlentities, stockage dans une base de donné avec les *escape_string, etc)
PS : J'espère ne pas être trop lourd et pas trop dur à comprendre.