Version en ligne

Tutoriel : Les magic quotes ou guillemets magiques

Table des matières

Les magic quotes ou guillemets magiques
C'est quoi cette bestiole ?
Désactiver les magic quotes

Les magic quotes ou guillemets magiques

C'est quoi cette bestiole ?

Bienvenue dans ce tutoriel sur les magic quotes, aussi appelés les guillemets magiques. Je vais vous expliquer ce que sont les magic quotes et comment les désactiver.

C'est quoi cette bestiole ?

Désactiver les magic quotes

Les magic quotes ou guillemets magiques sont une protection de PHP qui effectue automatiquement des addslashes (place un \ devant les ' pour les échapper) sur les valeurs reçues en HTTP.

Exemple de la fonction addslashes :

<?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êtes en utilisant les apostrophes). L'échappement est automatiquement fait.
Mais ce comportement est de plus en plus remis en cause pour des questions de performance 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 ; si elles viennent d'un fichier (d'une base de données ou d'un calcul), elles ne le sont pas. Ceci entraîne souvent des oublis de conversion de données ne provenant pas de la requête HTTP.

Il est donc préférable de désactiver les magic quotes.


Désactiver les magic quotes

Désactiver les magic quotes

C'est quoi cette bestiole ?

Si vous décidez de désactiver les magic quotes, il faut que vous pensiez bien à sécuriser vos requêtes SQL à l'aide de la fonction mysql_real_escape_string ou de la fonction addslashes.

Exemple de requête sécurisée :

<?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 les présenter toutes 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. :p

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. Il s'agit du 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 des bases de données, activation d'extensions).

Trouvez l'endroit où il y a :

;;;;;;;;;;;;;;;;;
; Data Handling ;
;;;;;;;;;;;;;;;;;

Puis descendez un peu, vous devriez trouver ceci :

; 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 rester compatibles 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 alors contrer leur effet. Il faut enlever les \ ajoutés. Il existe pour cela la fonction stripslashes().

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 :

<?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. En effet, si par exemple la configuration du serveur est modifié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 : du coup, quelle que soit leur configuration, votre application fonctionnera !

Voilà, ce tuto est fini : j'espère avoir été le plus clair possible. Si vous avez des questions / remarques ou autres, n'hésitez pas !
Merci aux zcorrecteurs (surtout ptipilou), pour leurs corrections et relectures. :)
f


C'est quoi cette bestiole ?