2010-05-09 6 views
2

Je travaille sur une ancienne base de code, où les programmeurs ont supposé que register_globals sera toujours activé. Par conséquent, les variables sont utilisées sans préfixe $ _GET ou $ _POST, à peu près dans chaque page (la base de code est énorme, des centaines de scripts). J'ai essayé de l'éteindre, mais le tout premier script (script de connexion) se déroule sur une boucle infinie. Je comprends que passer par un script à la fois, et une ligne à la fois et corriger les variables est probablement la seule option (en ajoutant le préfixe $ _GET ou $ _POST selon le cas). Est-ce que quelqu'un a déjà fait ça? Comment l'as-tu fait? Aucun conseil?PHP - désactiver les globals de registre, quelle est la meilleure façon de corriger le code?

+4

bonne chance, je me sens pour vous. – Jacco

+0

@ Jacco, Second. –

Répondre

1

Cela peut entraîner plus de dégâts que de bien, mais:

  1. Grep les name="foo" éléments de formulaires dans une liste seperated CSV ou d'une ligne quelque chose et obtenir l'attribut action (uniquement si elle se rapporte à un script réel)
  2. parcourez la liste CSV ou séparés par des lignes et effectuez une recherche et un remplacement en utilisant sed pour remplacer $ currentval par $ _POST ['currentval']/$ _ GET ['currentval'] ou $ _REQUEST ['currentval'] (mais attention aux cookies)

par exemple:

grep -o -E "(action|name)=\"[a-zA-Z0-9_]+\"" formfile.php | sed -E "s/.*\"([a-zA-Z0-9_]+)\"/\\1/" > vars.list 

vous donnera une liste séparée de la ligne de variables affichées (ish) que vous pouvez parcourir dans un script bash ou quelque chose pour remplacer les vars.

EDIT

Si vous souhaitez activer register globals sur pour un site. Ajouter à votre .htaccess ou configuration d'Apache:

php_value register_globals "On"

0

Vous pouvez répliquer register_globals en utilisant le code suivant:

foreach ($_REQUEST as $var => $val) $$var = $val; 

Tout ce que vous devez ensuite faire est de trouver un moyen d'avoir cette course en ligne avant chaque scénario. Vous pouvez le faire de plusieurs façons:

  1. Copiez et collez-le au début de chaque fichier;
  2. En utilisant mod_rewrite de manière à transformer chaque requête en (par exemple) register_globals.php?forward_to=originally_request_file.phpregister_globals.php contient l'annonce de ligne ci-dessus puis inclut le fichier $_GET['forward_to'];
  3. Il existe une directive auto_prepend_file dans votre configuration PHP qui exécutera un script spécifique avant que chaque fichier ne soit exécuté comme d'habitude. Vous pourriez le faire pointer vers un fichier avec la ligne ci-dessus. En savoir plus: http://php.net/auto-prepend-file

plus à un point (3), vous pouvez le définir dans le fichier .htaccess comme suit:

php_value auto_prepend_file /var/www/register_globals.php 
+0

C'est une idée assez soignée, mais n'est-ce pas juste comme laisser des globals de registre sur ?? Peut-être pire?Je me demande si '' ferait ce que je pense là;) –

+0

Hm, quand j'ai lu la question que je pensais OP était chercher le meilleur moyen de faire fonctionner le script sans avoir à retourner 'register_globals' dans la configuration, contrairement à sa priorité étant que le script a fonctionné directement en utilisant' $ _GET' ou '$ _POST'. – icio

+0

cela équivaut juste à utiliser la fonction extract(), n'est-ce pas? –

Questions connexes