En algunos servicios de hosting compartido tenemos php4 configurado con register_globals activado. Esto supone un fallo de seguridad y que algunos cms como drupal no se puedan instalar
Para desactivarlo, algunos de esos servicios nos ofrecen la posibilidad de crear nuestros propios php.ini en cada directorio para tener la configuración de php que necesitemos.
Otra solución en el caso de que lo anterior, o un php_flag/php_value con register_globals a 0 en nuestro .htaccess, no nos funcione o no nos parezca apropiado, tenemos la opción de forzar a php para que sea tratado como php5, versión que trae el register globals desactivado por defecto. Para ello debemos añadir ésta línea en el .htaccess:
AddType x-mapp-php5 .php
Marzo 18th, 2008 at 11:49 am
Interesante truco que me va a ser de gran utilidad con un par de CMS que tengo instalados en dreamhost :). Gracias Asier.
Marzo 18th, 2008 at 1:54 pm
Acabo de tener un problema al publicar una web que en local funcionaba bien, porque tenia register_globals=On. En produccion register_globals estaba desactivado y no funcionaba casi nada.
Por ejemplo, $Action no era reconocido y hubo que sustituirlo por $_POST['Action'] para que funcionara para variables POST o GET.
Parece que por seguridad es recomendable esta configuración. Para solucionarlo optamos por la opción de meter un pequeño código en nuestros php’s, para no tener que cambiar todo el código que ya habia hecho.
El código es este:
foreach($_POST as $postvar=>$var){
$$postvar=$var;
}
foreach($_GET as $getvar=>$var){
$$getvar=$var;
}
Funciona bien, pero, ¿Que pensais de esta solucion? Pienso que tendríamos por duplicado las variables, ¿no? ¿Cual hubiera sido la solución más correcta?
Gracias y un saludo,
Manu.
Marzo 18th, 2008 at 2:48 pm
@Ruben me alegro que te sirva el apunte, un saludo!
@Manu no sólo por seguridad es recomendable quitar el register globals, en la versión 5 de php (la actual que tiene soporte) viene desactivado por defecto y en la versión 6 han eliminado esta configuración.
Cómo solución te vale, pero no olvides limpiar los valores recibidos (con filtros si tienes php >=5.2 http://es.php.net/filter).
Yo recogería cada variable pasada y después asignaría su valor a las variables que usas en la aplicación, para tener un mayor control. Lo haría algo así:
if(isset($_GET['variable']) &&
isset($_GET['variable2']){
$variable = htmlentities($_GET['variable']);
$email = filter_var($_GET['variable2'],FILTER_VALIDATE_EMAIL);
}
//lo mismo para los POST
Puede parecer un poco redundante, el tener por un lado una variable $_GET['variable'] y luego por otro, otra variable $variable… pero ten en cuenta que si en un futuro cambias un paso de $_GET a $_POST, porque tu script ahora se llama por ajax por ejemplo, o cambias el nombre de las variables pasadas, sólo tienes que hacer el cambio en un sitio.
Un saludo!
Marzo 18th, 2008 at 3:25 pm
¿Recomendarias todo esto como buenas practicas en PHP, es decir; convertir las variables _POST y _GET además de filtrarlas como comentabas en favor de la portabilidad?
Gracias por la info, me ha venido muy bien el tema de filtrados.
Un saludo,
Manu.
Marzo 18th, 2008 at 4:39 pm
@Manu, desde luego yo no llamo todo el rato a lo largo del script a las variables $_GET y $_POST.
El filtrado es para prevenir ataques xss o sql injection.
Me alegra haberte sido de ayuda
Un saludo!!
Julio 16th, 2008 at 5:57 pm
GraciaS….
No me di cuenta que podia crear el archivo php.ini y lo cree para subirlo a mi hosting donde se encuentra el /public_html/index.php
el archivo php.ini le puse lo siguiente:
register_globals = Off
SOLUCIONADO…