La directiva register_globals en PHP 4.2.0
|  | 
	| Por Joaquin Gracia |  
	|  |  
	| Artículos publicados: 7 Valoración media: 3.64/5
 Usuario desde: 20/06/1998
 
 |  | 
A partir de la versión de PHP 4.2.0 el valor por defecto de la directiva register_globals es off. El por qué de este cambio viene motivado por un aumento del nivel de seguridad en la configuración del PHP por defecto. Pero esto puede provocar que nuestras páginas dejen de funcionar.
La directiva register_globals cuando esta activada (estado que estaba por defecto antes de la versión 4.2.0 de PHP), provoca que automáticamente se generen variables globales para cookies y valores enviados por get y post entre otros.
Por ejemplo:
Si llamábamos a una página con http://www.internet.com/prueba.php?var1=4, esto provocaba que en la página prueba.php automáticamente se generase la variable $var1 con el valor 4.
Por razones de seguridad este comportamiento automático se ha cambiado, estableciendo el valor por defecto de register_globals a off.
Este cambio puede producir que nuestras antiguas páginas dejen de funcionar, ante esto tenemos dos opciones:
- Activar el register_globals a on.
- Dejar register_globals a off y cambiar nuestras páginas por las referencias adecuadas a cada caso. Esta es la opción más recomendable.
¿Cómo debemos hacer este cambio?
Debemos buscar todas aquellas variables que son definidas automáticamente, variables del servidor, que provienen de get o post, cookies, files, variables de entorno o sesión.
Reemplazar esas variables por las referencias adecuadas en cada caso, en PHP se han definido unos arrays diferentes con valores, dependiendo del lugar de procedencia. Así tenemos los arrays $_SERVER, $_GET, $_POST, $_COOKIE, $_FILES, $_ENV, $REQUEST y $_SESSION.
Si por ejemplo teníamos el siguiente script:
print "Su edad: ".$edad; //cookie
print "Navegador: ".$HTTP_USER_AGENT;
print "Variable: ".$var; //variable de get
Deberíamos reemplazarlas por:
print "Su edad: ".$_COOKIE['edad']; //cookie
print "Navegador: ".$_SERVER['HTTP_USER_AGENT'];
print "Variable: ".$_GET['var']; //variable de get
Para más información:
	| Bio: Joaquin Gracia es Ingeniero superior en Informática por Centro Politécnico Superior de la Universidad de Zaragoza, diplomado en informática por la Escola Politècnica Superior de la Universidad de Gerona, Microsoft Certified Professional y entusiasta navegante de Internet desde los inicios en España.
 
 
 Otros artículos recientes de este autor:
 | 
Fecha publicación: 02/02/2003
Valoración
Este artículo ha sido valorado 385 veces. Valor: 


 [3.89/5]   
	Comentarios
si se desactiva los register globals una opcion rapida para usar las variables de un formulario en forma directa puede ser incluir este fragmento en la cabecera de los scripts:
<?php
foreach($_POST as $k=>$v){
    $$k=$v;
}
?>
lo mismo se podria usar para $_GET, $_COOKIE, $SERVER
Hombre si haces eso pues no desactives el Register Globlas y ya esta. Esta claro que ese script funciona pero etamos ante el mismo problema. Recordemos que se hace por seguridad
Saludos Gonzalo 
Una buena manera de realizar páginas en php que admita el viejo formato es el siguiente:
if (!isset($_server["PHP_SELF"]))
{
$_GET = $HTTP_GET_VARS;
$_POST = $HTTP_POST_VARS;
$_SESSION = $HTTP_SESSION_VARS;
}
a partir de alli podremos tomar las variables como arrays estemos o no con la opcion GLOBALS activada.
Ej:
$nombre = $_GET["nombre"];
tomara la varable nombre de igual manera
Espero que se entienda, sirve mucho para unificar el código de php para todos los sitios.
Mucho más facil que eso es poner
ini_set("register_globals","1");
Y asi usas de modo global todas las variables :-)
Claro esta si tenemos avilitada la función ini_set() en nuestro server.
Se debe utilizar register_globals = on, por los motivos expuestos.
Existe una forma más eficiente de modificar los programas antiguos sin invertir mucho tiempo cambiando las lineas de código.
Es mejor utilizar una sola línea al inicio de cada script que diga lo siguiente :
extract($_GET);
Con solo esta línea nuestros programas funcionaran como lo venían haciendo antes de la versión 4.2.0
Con este pequeño cambio, en lugar de cambiar cada línea en donde aparece la variable, ej:
print "Variable: ".$_GET['var'];
Dejamos intacta la línea de código, ej:
print "Variable: ".$var;
Hacer lo mismo de acuerdo a cada procedencia de la variable, ej:
extract($_POST);
Habria que aclarar que si se usa:
extract($_POST); 
en caso de existir variables con el mismo nombre, se sobreescriben sus valores. Para evitar esto, en lugar de lo anterior habria que hacer:
extract($_POST,EXTR_SKIP);
con lo que quedarian los valores originales. 
gracias david....me estan funcionando perfectos los scripts con extract($_POST,EXTR_SKIP); 
fue de gran ayuda.
Tavo
Medellin-Colombia.
Pues no consigo hacer funcionar 
extract($_POST,EXTR_SKIP); lo sitúo al 
principio de las páginas y no funciona.
Estoy haciendo las pruebas con un sistema de 
paginación que pasa la variable a la misma 
página y no funciona. En cambio el 
extract($_GET); me funciona a medias, no sé 
porque en algún número de página no 
funciona y salta al primero.
| Rodrigo Arenas | 09/11/2005 | 
 No use extract() en datos no confiables, como entradas de usuario ($_GET, ...). pero si lo hace, por ejemplo, si quiere correr codigo anterior que confía temporalmente en register_globals, asegurese de que usa una de los valores de no-sobreescribir del parámetro tipo_extraccion tales como EXTR_SKIP y asegurese de extrar las variables $_SERVER, $_SESSION, $_COOKIE, $_POST y $_GET ese orden.
	
	
	Añadir un comentario
Si no está de acuerdo con algo o quiere añadir más información al respecto puede incluirla añadiendo un comentario.
    
	Colabora
	¿Te sientes capacitado para escribir un artículo como este? ¿Te gustaría colaborar escribiendo artículos en WebEstilo? Háznoslo saber !!