Désactiver la fonction magic_quotes_gpc

Page 1 / 1

Certains hébergeurs dont LWS, active la fonctionnalité "magic_quotes_gpc" qui permet de protéger les données envoyées par les méthodes "GET", "POST", ...

Cette information est visible via la fonction "phpinfo" de PHP.

magic_quotes_gpc

Le problème s'est que lorsque l'on protège ses requêtes SQL via les fonctions "PDO::quote" (ou en PHP4 avec mysql_real_escape_string qui est dépréciée), cette fonctionnalité pose problème car la protection s'applique 2 fois sur nos données. Nous nous retrouvons donc avec des \\' au lieu des \' et cela produit donc une erreur SQL.

Le 2 ème problème avec cette fonctionnalité, c'est tout simplement qu'il est impossible de la désactiver par "ini_set" comme on aurait souhaités le faire. Comme indiqué dans la documentation officielle de PHP.net.

Toujours selon la documentation de PHP, il est tout de même possible de la désactiver :

  • via le fichier "php.ini" si vous y avez accès en y ajoutant ou en y modifiant les lignes suivantes :

    Apache

    ; 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
  • via un fichier ".htaccess" en y ajoutant la ligne suivante "php_flag magic_quotes_gpc Off".
    Néanmoins, nous avons testé cette possibilité chez notre hébergeur et cela n'a eu aucun effet (il s'agit peut-être d'une mesure de sécurité chez l'hébergeur).

Vu que nous n'avons pas accès au fichier "php.ini" de l'hébergeur et que la 2ème possibilité n'a pas fonctionnée, nous avons donc utilisé la solution proposée dans les commentaires du site de PHP.net, qui elle fonctionne correctement.

PHP

<?php
if (get_magic_quotes_gpc()) {
  function stripslashes_gpc(&$value){
    $value = stripslashes($value);
  }
  array_walk_recursive($_GET, 'stripslashes_gpc');
  array_walk_recursive($_POST, 'stripslashes_gpc');
  array_walk_recursive($_COOKIE, 'stripslashes_gpc');
  array_walk_recursive($_REQUEST, 'stripslashes_gpc');
}
?>

Ce petit script PHP très puissant ne va pas désactiver la fonctionnalité "magic_quotes_gpc" mais effectuer le traitement inverse (si cette fonctionnalité est activée sur le serveur) pour annuler le fonctionnement de "magic_quotes_gpc". En nous aidant de la documentation, nous pouvons vous expliquer le fonctionnement de cette fonction personnalisée. En fait, elle parcoure toutes les cases des tableaux "_GET", "_POST", "_COOKIE" et "_REQUEST" et effectue le traitement inverse sur chaque des cases via la fonction "stripslashes" de PHP.

 

Pour finir, sachez que cette fonction a été dépréciée par PHP.net depuis la version "5.3.0" et va donc disparaitre à partir de la version "5.4.0".