2010-01-16 8 views
0

J'écris une application qui doit être portable. Je sais que je dois désactiver les guillemets magiques sur la configuration de PHP mais dans ce cas, je ne sais pas si je peux le faire, donc je suis en utilisant le code suivant:PHP - Shorter Magic Quotes Solution

if (get_magic_quotes_gpc() === 1) 
{ 
    $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); 
} 

Pour simplifier le processus de désactivation des citations magiques J'ai eu l'idée suivante:

if (get_magic_quotes_gpc() === 1) 
{ 
    foreach (array('GET', 'POST', 'COOKIE', 'REQUEST') as $array) 
    { 
     ${'_'.$array} = unserialize(stripslashes(serialize(${'_'.$array}))); 
    } 
} 

Mais j'ai essayé et je suis une erreur, je suis incapable de comprendre, par exemple avec ?name=O'Reilly:

serialize($_GET); // a:1:{s:4:"name";s:9:"O\'Reilly";} 
stripslashes(serialize($_GET)); // a:1:{s:4:"name";s:9:"O'Reilly";} 

B ut unserialize(stripslashes(serialize($_GET))) me donne cette erreur bizarre:

Avis: unserialize(): Erreur à l'offset 30 de 32 octets


EDIT: En raison de l'attribut de longueur dans serialize() j'ai changé la code à utiliser les fonctions JSON:

if (get_magic_quotes_gpc() === 1) 
{ 
    foreach (array('GET', 'POST', 'COOKIE', 'REQUEST') as $array) 
    { 
     ${'_' . $array} = json_decode(stripslashes(json_encode(${'_' . $array})), true); 
    } 
} 

Cependant maintenant le tableau $_GET est à venir vide, quelqu'un peut-il m'expliquer pourquoi?

+0

Pour autant que je sache, ils ne seront pas réellement supprimer get_magic_quotes_gpc en PHP 6, exactement parce que ça va briser ce genre de scripts sans raison, alors les gens les ont convaincus que ce serait une bêtise à faire. Au lieu de cela, il sera simplement marqué comme obsolète. Juste quelque chose à garder à l'esprit si vous voulez simplifier le code un peu. –

+0

@Michael: Le manuel (http://pt2.php.net/manual/fr/security.magicquotes.php) indique toujours le contraire: ** Cette fonctionnalité a été désapprouvée à partir de PHP 5.3.0 et supprimée à partir de PHP 6.0 .0.** –

+1

Non, c'est la partie du manuel qui parle des citations magiques en tant que caractéristique - qui va en effet être supprimée. Le fichier NEWS en cours pour PHP6 (http://svn.php.net/viewvc/php/php-src/trunk/NEWS?revision=289244&view=markup) indique "Changé get_magic_quotes_gpc(), get_magic_quotes_runtime pour toujours retourner false et set_magic_quotes_runtime() pour élever un E_CORE_ERROR. ", donc les fonctions pour vérifier si elles sont activées sont toujours là. –

Répondre

1

résolu le problème, Je devais utiliser le drapeau JSON_HEX_APOS en json_encode():


Avant (mqgpc.php?name[got'cha]=O'Reilly):

Array 
(
    [name] => Array 
     (
      [got\'cha] => O\'Reilly 
     ) 
) 

Après (mqgpc.php?name[got'cha]=O'Reilly):

Array 
(
    [name] => Array 
     (
      [got'cha] => O'Reilly 
     ) 
) 
2

Je ne pense pas que la deuxième version fonctionnera. Les chaînes sérialisées sont stockées avec leur longueur, si vous supprimez des caractères, vous devez mettre à jour cette valeur de longueur. Je préférerais mettre en œuvre cette façon d'améliorer la lisibilité:

function strip_slashes_recursive(&$value) { 
    if (!is_array($value)) { 
     $value = strip_slashes($value); 
    } else { 
     foreach (array_keys($value) as $key) { 
      $arrayValue = strip_slashes_recursive($value[$key]); 
      unset($value[$key]); 
      $value[strip_slashes($key)] = $arrayValue; 
     } 
    } 
} 

foreach (array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST) as &$array) { 
    strip_slashes_recursive($array); 
} 
// don't forget to unset references or it can lead to very nasty bugs 
unset($array); 
+1

+1, Bien sûr, la longueur ... Silly moi! –

0

je résous généralement ce problème de cette façon:

function smagic($params){ 
    if(get_magic_quotes_gpc()){ 
     if(!is_array($params)) 
      return stripslashes($params); 
     else 
      return array_combine(array_map('stripslashes',array_keys($params)), array_map('smagic',array_values($params))); 
    } 
} 

Et puis, pour $ _GET:

$_GET = smagic($_GET); 
+0

Ne gère pas les clés de tableau. = \ –

+0

@AlixAxel Vous aviez raison: Vérifiez maintenant que j'ai corrigé le bug;) –