Aller au menu - Aller au contenu

Icône Les magic quotes ou guillemets magiques

Avatar
Mise à jour : 22/08/2008
155 visites depuis 7 jours, classé 467/786
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 ?

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 :
Code : PHP
1
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ê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

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 :
Code : PHP
1
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 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 :
Code : Autre
1
2
3
;;;;;;;;;;;;;;;;;
; Data Handling ;
;;;;;;;;;;;;;;;;;

Puis descendez un peu, vous devriez trouver ceci :
Code : Autre
1
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 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().

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. 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 !

Q.C.M.

Que signifie "magic quotes" ?
Que font les magic quotes ?
Les magic quotes, c'est…

Statistiques de réponses au QCM

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

Partager

22 commentaires pour "Les magic quotes ou guillemets magiques"
Note moyenne : 2.90 / 4 (10 votes)
Pseudo Commentaire
Hors ligne alz # Posté le 09/02/2009 à 10:52:15

Dans Dreamweaver, quand on utilise les fonctions d'accès aux bases de données (ben oui quand on a 40 formulaires à faire pour hier c'est plus rapide) il crée cette fonction à laquele il fait appel à chaque variable passée à mysql :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;

  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}
Hors ligne Crazyjuly # Posté le 17/04/2009 à 09:46:27
Avatar

Ville : Villeneuve-sous-dammartin
Pays : France métropolitaine
Études : IUT Blois

Pendant que je galérais pour trouver une solution, je suis tombée sur ce tuto.
J'ai pu comprendre l'origine du problème, et même si je n'étais pas dans une situation similaire au tuto, j'ai pu rapidement adapter mon code pour ne plus avoir de guillemets magiques.
Merci beaucoup pour ce tuto Sowhat.
Hors ligne koechlin # Posté le 21/10/2009 à 19:32:55
Avatar

Ville : Paris
Pays : France métropolitaine

Citation : sowhat
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 !


Faute de français : et, quelle que soit leur configuration ...

On retrouve partout les mêmes fautes... Ce n'est pourtant pas compliqué de comprendre qu'un déterminant ne peut pas être à lui tout seul le sujet d'un verbe!
Hors ligne Enestyr # Posté le 26/06/2010 à 00:32:44
Vive le nutella -_-"
Avatar

Je pense pas que ça soit très utile avec PDO... mais c'est un bon tuto quand même !

Ma vie a son secret, ma vie a son mystère... :'( C'est trop beau la poésie !
 
Connecté Dominique0796 # Posté le 12/09/2011 à 14:43:02
Pas de victoires sans échecs
Avatar

encore mieux :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?php
if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc())
{
	function stripslashes_deep($value)
	{
		return is_array($value) ?
			array_map('stripslashes_deep', $value) :
			stripslashes($value);
	}
	$_POST    = array_map('stripslashes_deep', $_POST);
	$_GET     = array_map('stripslashes_deep', $_GET);
	$_COOKIE  = array_map('stripslashes_deep', $_COOKIE);
	$_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}


c'est pas moi qui l'ai fait, ça traîne depuis longtemps sur mon disque dur :p .
en effet, il y a aussi la variable $_REQUEST (si elle existe) à traiter ;)
 

Voir tous les commentaires
Ce tutoriel a été corrigé par les zCorrecteurs.