Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Les magic quotes ou guillemets magiques sont une protection de PHP qui effectuent automatiquement des
addslashes (place un devant
\ les
' pour les échapper) sur les valeurs reçues en HTTP.
Exemple de la fonction
addslashes :
Code : PHP1
2
3
4
5 | <?php
$chaine_non_protegee = "S'alut !"; // une phrase contenant un '
$chaine_protegee = addslashes($chaine_non_protegee); // le ' est échappé
echo $chaine_protegee; // affiche : S\'alut !
?>
|
Cette protection est considérée comme une sécurité pour le développeur, car il n'a plus à faire la conversion lui-même pour être protégé des injections SQL (détournements de requête en utilisant les apostrophes), l'échappement étant automatiquement fait.
Mais, ce comportement est de plus en plus remis en cause pour des questions de performances et de facilité de programmation.
En effet, la conversion n'est pas toujours nécessaire, et l'activation de cette protection implique de toujours savoir d'où viennent les données qu'on utilise : si elles viennent de la requête HTTP, elles sont déjà converties, et si elles viennent d'un fichier (ou d'une base de données, ou d'un calcul) elles ne le sont pas. Cela entraîne souvent des oublis de conversion de données ne venant pas de la requête HTTP.
Il est donc préférable de désactiver les magic quotes.
Si vous décidez de désactiver les magic quotes, il faut que vous pensiez bien à sécuriser vos requêtes SQL avec la fonction
mysql_real_escape_string ou la fonction
addslashes.
Exemple de requête sécurisée :
Code : PHP1
2
3
4 | <?php
$pseudo = mysql_real_escape_string($_GET['pseudo']); // on protège d'abord la variable $_GET['pseudo']
$reponse = mysql_query("SELECT champ1, champ2 FROM membre WHERE pseudo = '$pseudo' "); // puis on l'utilise dans une requête
?>
|
Il existe deux façons de désactiver les guillemets magiques, je vais vous présenter les deux.
La première est surtout pratique si vous avez votre propre serveur et que personne ne risque de modifier la configuration de PHP.
La seconde est pratique car elle permet de fonctionner sur n'importe quel serveur (avec ou sans les magic quotes).
Je vous conseille, par conséquent, la seconde.
Vous êtes en hébergement dédié ("désactivation dans le fichier de configuration")
Si vous êtes en hébergement dédié, vous devez pouvoir accéder au fichier de configuration de PHP : le fichier :
php.ini.
Le
php.ini est un fichier texte ASCII divisé en plusieurs sections, chaque section permettant de configurer différents paramètres (chemins d'accès des fichiers, changement des paramètres de sessions et de bases de données, activation d'extensions).
Trouvez l'endroit où il y a :
Code : Autre1
2
3
| ;;;;;;;;;;;;;;;;;
; Data Handling ;
;;;;;;;;;;;;;;;;; |
Puis descendez un peu, vous devriez trouver ceci :
Code : Autre1
2
3
4
5
6
7
8
9
10
11
| ; Magic quotes
;
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = On
; 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 |
Ce sont les valeurs par défaut.
Pour désactiver les magic quotes, mettez
magic_quotes_gpc à
Off. Normalement,
magic_quotes_runtime et
magic_quotes_sybase sont désactivés ; s'ils ne le sont pas, mettez-les à
Off.
Vous n'avez pas accès au php.ini ("désactivation dans le code")
Si vous êtes en hébergement mutualisé, vous n'avez pas accès au
php.ini, l'activation des magic quotes dépend de votre hébergeur. Beaucoup d'hébergeurs continuent à activer cette directive pour compatibilité avec les anciens scripts, mais d'autres la désactivent.
Pour savoir si les magic quotes sont activés sur votre serveur, utilisez la fonction
get_magic_quotes_gpc(). Cette fonction renvoie 1 s'ils sont activés, sinon 0.
S'ils sont activés, il faut contrer leur effet, il faut leur enlever les
\ ajoutés. Il existe pour cela la fonction
stripslashes().
T'es gentil, mais c'est pas très pratique d'appliquer stripslashes sur toutes les variables extérieures ($_POST, $_GET et $_COOKIE) . Si je dois faire $variable = stripslashes($_GET['variable']); pour chaque variable, c'est nul !
C'est vrai, mais heureusement la fonction (eh oui, encore une ! )
array_map va nous sauver.
Cette fonction permet d'appliquer une fonction sur tous les éléments d'un tableau. Cela a l'air compliqué, mais c'est simple.
Vous allez comprendre, voici un code qui annule l'effet des magic quotes :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | <?php
function stripslashes_r($var) // Fonction qui supprime l'effet des magic quotes
{
if(is_array($var)) // Si la variable passée en argument est un array, on appelle la fonction stripslashes_r dessus
{
return array_map('stripslashes_r', $var);
}
else // Sinon, un simple stripslashes suffit
{
return stripslashes($var);
}
}
if(get_magic_quotes_gpc()) // Si les magic quotes sont activés, on les désactive avec notre super fonction ! ;)
{
$_GET = stripslashes_r($_GET);
$_POST = stripslashes_r($_POST);
$_COOKIE = stripslashes_r($_COOKIE);
}
?>
|
Ce code permet donc de contrer l'effet des magic quotes. Les magic quotes agissent avant l'analyse du code, ce petit code est donc à placer au tout début de votre page.
Même si les guillemets magiques sont désactivés sur votre serveur, utilisez ce code, car si par exemple la configuration du serveur est changée ou que vous changez de serveur, votre application marchera dans tous les cas !
Un autre exemple : vous avez fait un forum ; sur votre site, les gens peuvent le télécharger pour l'installer sur leur serveur et, quelque soit leur configuration, votre application fonctionnera !