Manejo Directiva Register Globals en PHP (register_globals)
Hola, antes de continuar con este post hago una pausa para declarar el objetivo primordial de este Blog, el cual es contribuir con la comunidad programadora sacando temas de esta indole y que sirvan de ayuda, ademas de servirme a mi mismo teniendo un repositorio que ayude a recordar las broncas en las que me he metido y he resuelto como programador, espero que a alguien mas le sirva.
Hoy escribire acerca de una directiva que a muchos programadores nos ah dado problemas, esta es register_globals, en PHP por supuesto.
Esta directiva se encuentra en el archivo de configuracion de php y puede tener 2 estados, On u Off, en versiones anteriores a la 4.2.0 esta aparecia por default en On y no asi en las versiones mas nuevas, por cuestiones de seguridad.
Lo que hace esta directiva al estar encendida es, que el servidor web considere a las variables EGPCS (Environment, GET, POST, Cookie, Server) como variables globales.
Esto junto con el hecho de que PHP no requiere la inicialización de variables significa que es muy fácil escribir código inseguro. Fue una decisión difícil, pero la comunidad de PHP decidió desahibilar esta directiva por defecto. Cuando está habilitada, las personas usan variables sin saber con seguridad de dónde provienen y solo queda asumir. Las variables internas que son definidas en el script mismo son mezcladas con los datos enviados por los usuarios y al deshabilitar register_globals se modifica este comportamiento.
Considera este ejemplo, con el que php.net ilustró la necesidad de cambio de configuración por defecto de PHP:
-
if (authenticate_user())
-
{
-
// aqui iria la función que comprobaria si el usuario
-
// tiene acceso a la página, y tras las comprobaciones
-
// establecidas, declararía "verdadero" el valor de $user_ok
-
-
$user_ok = true;
-
-
}
-
-
// En teoria, si $user_ok = verdadero, el usuario esta validado
Nada mas sencillo que llamar a la página añadiendo a la url nuestra propia variable: http://www.sitio.com/log.php?user_ok=1 y estariamos validados, aunque la función authenticate_user() devolviera un valor de usuario inválido.
Para conocer el estado actual de la directiva register_globals de nuestra instalacion php, podemos hacer un echo a la funcion phpinfo(), la cual nos desglosa es status completo de la instalacion.
En caso de estar activada, simplemente necesitamos editar el archivo php.ini, buscar la directiva register_globals y cambiar el status a off.
En caso de no tener acceso completo al server, porque estamos trabajando en un host de renta o porque simplemente no somos los administradores, podemos cambiar el status de la directiva mediante el archvo .htaccess agregando esta linea:
php_value register_globals 1
Por otro lado, algunas aplicaciones como OSCommerce y muchos programadores, suelen o solian hacer sus scripts considerando que esta directiva estaria encendida, para esto necesitaremos hacer un pequeño tweak a sus scripts para que trabajen con register_globals modo Off, pero de esto platicaremos en un post mas adelante.
Saludos...

3 Responses to “Manejo Directiva Register Globals en PHP (register_globals)”
By Dante Robles on Dec 7, 2007 | Reply
Excelente Articulo Compadre, es bueno estar enterado de las configuraciones de PHP
By Miguel Rojas on Apr 12, 2008 | Reply
muy bueno y muy didáctico, quisiera preguntarte sobre el tweak para hacer que oscommerce trabaje con regiter_globals en off.
gracias por compartir
Miguel
By Titux on Apr 15, 2008 | Reply
Que tal Miguel Rojas, el twear para las aplicaciones como oscommerce, es utilizar la funcion extract($_REQUEST) en los scripts de la aplicacion, esta funcion tomaria los valores que vengan en el array y los convierte a variables locales, talves sea algo trabajoso, pero es lo que de momento se me ocurre.
Si gustas le echo un ojo mas dejalte y posteo algo al respecto. te parece?
Saludos y gracias por tus comentarios.
bytes.