2008-08-09 11 views
10

He heredado algún código PHP heredado lo que se escribió cuando era una práctica estándar usar register_globals (A partir de PHP 4.2.0, esta directiva está desactivada, publicada el 22 de abril de 2002).Hacer que el código funcione con register_globals desactivado

Sabemos ahora que es malo para la seguridad tenerlo habilitado. El problema es ¿cómo puedo encontrar todos los lugares en el código donde necesito usar $_GET o $_POST? Mi único pensamiento fue establecer el informe de errores para advertir sobre las variables no inicializadas y luego probar cada parte del sitio. hay una manera mas facil? ¿Tendré que probar cada ruta de código en el sitio o PHP dará advertencias sobre la base de un archivo?

Respuesta

5

Si configura el informe de errores en E_ALL, advierte en el registro de errores sobre las variables indefinidas completas con nombre de archivo y número de línea (suponiendo que está iniciando sesión en un archivo). Sin embargo, solo avisará si aparece una variable indefinida, por lo que creo que deberá probar cada ruta del código. Ejecutar php desde la línea de comandos no parece ayudar también.

Hay una herramienta de depuración llamada xdebug, no la he probado, pero ¿puede ser útil?

0

Sé que hay una manera de establecer los valores de php.ini para que el guión con un cierto orden, por lo que fui a buscar y encontramos este también - Goto last post on page

También encontré el siguiente post que puede ser de utilidad - Goto last post on the page

Añadiré más a esto si nadie ha encontrado una respuesta, pero ahora debo tomar un tren.

3

Escribí script usando las funciones integradas Tokenizer. Es bastante duro pero funcionó para la base de código en la que estaba trabajando. Creo que también puedes usar CodeSniffer.

2

Puede 'falsificar' manualmente el efecto global de registro pero agregar algo de seguridad. (En parte lo agarró esto desde el tenedor osCommerce llamados xoops)

// Detect bad global variables 
$bad_global_list = array('GLOBALS', '_SESSION', 'HTTP_SESSION_VARS', '_GET', 'HTTP_GET_VARS', '_POST', 'HTTP_POST_VARS', '_COOKIE', 'HTTP_COOKIE_VARS', '_REQUEST', '_SERVER', 'HTTP_SERVER_VARS', '_ENV', 'HTTP_ENV_VARS', '_FILES', 'HTTP_POST_FILES'); 
foreach ($bad_global_list as $bad_global) { 
    if (isset($_REQUEST[$bad_global])) { 
     die('Bad Global'); 
    } 
} 

// Make global variables 
foreach ($_REQUEST as $name -> $value) { 
    $$name = $value; // Creates a varable nammed $name equal to $value. 
} 

Aunque te gustaría que ajustar para que su código sea más seguro, al menos mediante la adición de sus variables de configuración globales (como la trayectoria y la base URL) a la mala lista global.

También podría usarlo para compilar fácilmente una lista de todas las variables get/post usadas para ayudarlo a reemplazar eventualmente todas las ocurrencias de, digamos $ return_url, con $ _REQUEST ['return_url];

Cuestiones relacionadas