par
Ryle » 01 mai 2007, 11:42
En fait, l'option magic_quotes va automatiquement, pour toutes les variables récupérées par php, protéger apostrophes, guillemets, etc. par des antislashes.
Le principal intérêt, c'est de pouvoir les injecter directement dans une requête SQL sans avoir à les protéger soit même :
$sql = "UPDATE ... SET champ = '".$var."'";
// avec magic quotes
echo $sql; // affiche : UPDATE ... SET champ = 'L\'exemple'
// sans magic quotes :
echo $sql; // affiche : UPDATE ... SET champ = 'L'exemple'
Sans les Magic Quotes, si tu ne fais rien, il y aurait une erreur de syntaxe, puisque SQL considèrera que la chaine s'arrête après le L. Entre parenthèse, c'est également une faille de sécurité si tu ne fais rien, puisque l'on peut volontairement envoyer une apostrophe pour fermer la chaine et enchainer avec un bout de code SQL malicieux.
Un exemple concret :
si tu testes l'authentification d'un utilisateur ainsi : "WHERE login = '".$login."'"
et que je me logue avec le login : "' OR '1'='1"
le test sera : "WHERE login = '' OR '1'='1'"
ce qui sera toujours vrai et me voilà utilisateur reconnu et authentifié :)
mysql_real_escape_string() a donc pour but de protéger ta chaine pour éviter ces "injection sql" :
$sql = "UPDATE ... SET champ = '".mysql_real_escape_string($var)."'";
Ce n'est bien sur qu'un exemple parmi d'autres

Après on peut aussi bricoler un truc pour qu'au début de ton script, il fasse un addslashes() sur chaque variable que tu récupères si le magic quotes est désactivé, mais ca devient déjà plus du bricolage

En fait, l'option magic_quotes va automatiquement, pour toutes les variables récupérées par php, protéger apostrophes, guillemets, etc. par des antislashes.[code]"L'exemple" devient "L\'exemple"[/code]
Le principal intérêt, c'est de pouvoir les injecter directement dans une requête SQL sans avoir à les protéger soit même :
[php]$sql = "UPDATE ... SET champ = '".$var."'";
// avec magic quotes
echo $sql; // affiche : UPDATE ... SET champ = 'L\'exemple'
// sans magic quotes :
echo $sql; // affiche : UPDATE ... SET champ = 'L'exemple'
[/php]
Sans les Magic Quotes, si tu ne fais rien, il y aurait une erreur de syntaxe, puisque SQL considèrera que la chaine s'arrête après le L. Entre parenthèse, c'est également une faille de sécurité si tu ne fais rien, puisque l'on peut volontairement envoyer une apostrophe pour fermer la chaine et enchainer avec un bout de code SQL malicieux.
Un exemple concret :
[php]si tu testes l'authentification d'un utilisateur ainsi : "WHERE login = '".$login."'"
et que je me logue avec le login : "' OR '1'='1"
le test sera : "WHERE login = '' OR '1'='1'"
ce qui sera toujours vrai et me voilà utilisateur reconnu et authentifié :)[/php]
mysql_real_escape_string() a donc pour but de protéger ta chaine pour éviter ces "injection sql" :
[php]$sql = "UPDATE ... SET champ = '".mysql_real_escape_string($var)."'";[/php]
Ce n'est bien sur qu'un exemple parmi d'autres :) Après on peut aussi bricoler un truc pour qu'au début de ton script, il fasse un addslashes() sur chaque variable que tu récupères si le magic quotes est désactivé, mais ca devient déjà plus du bricolage :)