Ajout de slashes abusif
Par Guillaume Sarramegna, le 13 oct. 2011
Vous vous en êtes peut-être déjà aperçu, mais lors de l'envoi d'un formulaire sur OVH, vous récupérez des caractères échappés sans que vous n'ayez rien demandé (ex : "C\'est un test" au lieu de "C'est un test").
La faute à qui ? Il suffit de regarder du côté des magic_quotes.
Avec les versions de PHP précédant la version 5.3.0, vous obtiendrez très probablement ce genre de problème. En effet, le paramètre magic_quotes_gpc par défaut est à true. De ce fait, les paramètres passés par la méthode GET (mais aussi POST et les cookies) sont manipulés pour ajouter un slash devant le délimiteur de chaîne qu'est l'apostrophe, ce qui peut être embêtant lors de l'affichage.
Plusieurs solutions s'offrent donc à vous.
En php :
<?php
// En remplaçant
echo "Nom: ".$_GET["nom"];
// par
echo "Nom: ".stripSlashes($_GET["nom"]);
Mais ceci n'est pas très pratique car il faudrait faire beaucoup de cas par cas. Du coup on peut réaliser une petite manipulation au début de notre page comme ceci (proposée par la doc PHP) :
<?php
if (get_magic_quotes_gpc()) {
$process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
while (list($key, $val) = each($process)) {
foreach ($val as $k => $v) {
unset($process[$key][$k]);
if (is_array($v)) {
$process[$key][stripslashes($k)] = $v;
$process[] = &$process[$key][stripslashes($k)];
} else {
$process[$key][stripslashes($k)] = stripslashes($v);
}
}
}
unset($process);
}
Mais là encore, c'est pas top !
La fonction stripSlashes() (opération inverse de addSlashes()) permet de supprimer les slashes pratiques car ils évitaient de faire appel à la fonction mysql_escape_string() (ou addSlashes()) avant insertion dans une base de données. En revanche, il est maintenant nécessaire de faire appel à stripSlashes() avant affichage. Ainsi, depuis la version 5.3.0, cette option n'est plus activée par défaut ce qui évite d'avoir les slashes d'échappement.
Du coup, lorsque l'on écrit un script destiné à n'importe quelle version de PHP, il doit déterminer comment celui-ci est configuré ou forcer la configuration pour savoir s'il faut ou non ajouter des slashes.
La meilleure des solutions serait de désactiver les magic_quotes dans le php.ini.
; Magic quotes
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off
; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off
; Use Sybase-style magic quotes (escape ' with '' instead of ').
magic_quotes_sybase = Off
Mais tout le monde n'y a pas accès. Une autre solution (encore) est de configurer cela dans le fichier .htaccess :
php_flag magic_quotes_gpc Off
Le problème c'est que cette commande n'est pas exécutée sur OVH, mais heureusement, ils nous en fournissent une autre pour désactiver les magic_quotes (à mettre dans le fichier .htaccess) :
SetEnv MAGIC_QUOTES 0
Et le tour est joué.