martes, enero 10, 2006

Oscommerce y register_globals

Hace unos días me sucedió un percance instalando un Oscommerce en un servidor Windows con register_globals desactivado en el PHP.INI . El OsCommerce requiere del register_globals activado para funcionar correctamente, sin embargo en muchos servidores Web se encuentra desactivado esta opción ya que representa un riesgo de seguridad a través de códigos PHP mal elaborados.

Sobre Apache en dependencia de la configuración del servidor se podría activar el register_globals con la linea "php_flag register_globals 1" al inicio del ".htaccess", pero en
este caso se trataba de un servidor Windows con el IIS como servidor Web.

Finalmente la solución aplicada fue la simulación de register_globals activado, implementado de la siguiente forma:

Primero hacer globales las cookies y variables get y post, esto en /includes/application_top.php:

if (function_exists('ini_get'))
{
if (!ini_get('register_globals')) {
if (is_array($_COOKIES))
foreach ($_COOKIES as $item => $value)
$$item = $value;
foreach ($_POST as $item => $value)
$$item = $value;
foreach ($_GET as $item => $value)
$$item = $value;
}
}

Luego, en el mismo fichero, posterior al inicio de sesión, hacer globales las variables de sesión:

$saved_sessions = array();
if (function_exists('ini_get')) {
if (!ini_get('register_globals'))
foreach ($HTTP_SESSION_VARS as $item => $value)
{
$$item = $value;
$saved_sessions[] = $item;
}
}

Finalmente en /includes/application_top.php y dentro de la función tep_redirect en /includes/functions, antes del redirect, devolver a la sesión los valores cambiados:

foreach ($saved_sessions as $item => $value)
$_SESSION[$value] = $$value;

Afortunadamente estos cambios fueron suficientes, y el OsCommerce ha funcionado correctamente a pesar de estar desabilitado el register_globals en el servidor.

La idea original de la solución me fue aportada por el desarrollador de Estadísticas Web D4W que la había aplicado anteriormente en la creación de una web de chistes a modo de experimento de posicionamiento y desarrollo web.

El método es aplicable a la mayoría de las webs en PHP que requieren del register_globals para funcionar, aunque debemos recordar que no es una buena práctica el uso de register_globals en el desarrollo de Webs con PHP, tanto por los posibles bugs que afecten la seguridad, como por las limintantes de los servicios de hosting en este aspecto.

17 Comentarios:

At 7:28 p. m., Blogger macrochika dijo...

Hola, tengo el problema con el register_globals y e intentado establecer los cambios que tu indicas...
No he logrado entender el ultimo paso.. no logro encontrar la funcion tep_redirect en la carpeta includes/functions
ni tampoco me queda claro donde establesco el
foreach ($saved_sessions as $item => $value)
$_SESSION[$value] = $$value;


Agradeceria muchiisisimo tu ayuda

 
At 8:08 p. m., Blogger Albertruxo dijo...

La funcion tep_redirect se encuentra en el archivo includes/functions/general.php

 
At 8:20 p. m., Blogger Albertruxo dijo...

Y otra cosa, se deben comentar las funciones:
/*if (function_exists('ini_get')) {
ini_get('register_globals') or exit('FATAL ERROR: register_globals is disabled in php.ini, please enable it!');
}*/
En los siguientes archivos:
includes/application_top.php
install/includes/application.php

Espero que te sirva, un saludo.

 
At 4:50 p. m., Blogger bokken dijo...

Yo me quedo antes, no se donde tengo que colocar este codigo exactamente, no se donde se inicia sesion, podeis ayudarme?

Luego, en el mismo fichero, posterior al inicio de sesión, hacer globales las variables de sesión:

$saved_sessions = array();if (function_exists('ini_get')) { if (!ini_get('register_globals')) foreach ($HTTP_SESSION_VARS as $item => $value) { $$item = $value; $saved_sessions[] = $item; }}

Gracias !

 
At 5:02 p. m., Blogger Antonio dijo...

Despues de hacer todo esto tengo problemas con la cesta. Siempre me sale vacia.

 
At 9:27 a. m., Blogger Carlos dijo...

VIEJOOOO GRACIASSSS :-D de maravillas! Un millon no sabes como se t agradece :-)

 
At 8:48 p. m., Blogger Nemesis dijo...

no tenia claro donde poner la segunda parte de las indicaciones, pero he probado y me ha funcionado a la primera! no he llegado a usar el ultimo parrafo de programacion que indicas pero la web funciona ahora. ire probando a ver si me falla algo.

muchas-muchas-muchisimas gracias!

 
At 5:28 a. m., Blogger ANDRES OCHOA dijo...

MUCHAS GRACIAS POR LA AYUDA, ESPERO QUE ESTO SEA TODO LO QUE TENGA QUE HACER!

THANKS FOR YOUR HELP GUYS, I HOPE THIS IS IT!

 
At 1:04 a. m., Blogger José Arturo Olsson Gonzáles dijo...

Tengo un problema con osCommerce, he hecho todos los pasos que indicas y todo a la perfección, no hay problemas, pero al pasar a configurar la instalacion me quedo en el 2do paso, le doy continuar, pero no avanza, no salen los datos en los que me pide la base de datos ni el ni el usuario y pass.
Ahora creo que es porque es una plantilla bajada de internet de TemplateMonster para oscommerce, y el problema esta en la instalación, pues cambio la carpeta de instalacion que tengo, por una copia nueva de la descarga original y corre, la instalacion pero tiene errores, podrias indicarme que estoy haciendo mal.
Saludos cordiales

 
At 6:40 p. m., Blogger Javier Viteri dijo...

Se puede implementar Oscommerce con Joomla para Diseño Web de Sitios

 
At 4:35 p. m., Blogger Jorge dijo...

Querria saber si esto puede aplicarse a un sitio funcionando, que de repente dejo de hacerlo. Y me tiro el mensaje del global...

 
At 4:49 p. m., Blogger Jorge dijo...

Me gustaria saber si esto es aplicable tambien a un sitio en funcionamiento que estaba funcionando y de repente no lo hace. y me tira el error del Global.

Y otra cosa:

El primer parche lo hago antes de comentar la misma linea existente en aplicattion_top.php?

El segundo parche tiene que ir en los dos archivos? el aplication_top y el /function/general? o solo en uno?

Este es el error que me sale despues de hacer lo que me indicaron:

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /nfs/c03/h01/mnt/47035/domains/dominio.com/html/includes/functions/general.php:22) in /nfs/c03/h01/mnt/47035/domains/dominio.com/html/includes/functions/sessions.php on line 67

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /nfs/c03/h01/mnt/47035/domains/dominio.com/html/includes/functions/general.php:22) in /nfs/c03/h01/mnt/47035/domains/dominio.com/html/includes/functions/sessions.php on line 67

Y cuando intento ver un producto:

Warning: Invalid argument supplied for foreach() in /nfs/c03/h01/mnt/47035/domains/dominio.com/html/includes/functions/general.php on line 22

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /nfs/c03/h01/mnt/47035/domains/dominio.com/html/includes/functions/general.php:22) in /nfs/c03/h01/mnt/47035/domains/dominio.com/html/includes/functions/sessions.php on line 67

 
At 7:30 p. m., Blogger JOSElin7 dijo...

gracias loco, funciona perfecto!

 
At 5:50 p. m., Blogger Alan G. WebDesigner dijo...

LA SOLUCIÓN!!!!!!!!!!!!!


http://www.magic-seo-url.com/oscommerce/tips/running-oscommerce-with-register-globals-off.html


Hola
He tenido el mismo problema, mi provedor de Hosting tenia PHP4, y mis tiendas funcinaban sin problema, pero de repente un dia dejo de funcionar.

Con todo respeto, esta pagina no me sirvio, por q a mi parecer no esta del todo bien explicada, y confunde mucho a las personas q no conoscemos el codigo php ni sql y solamente nos limitamos al remplazo de lineas de codigo segun otros manuales.

PERO ENCONTRE LA SOLUCIÓN.!!!!

Es una web que esta en ingles pero considero q a nivel de usuario, resulta muy facil.

aqui les dejo el link

Saludos y si les funciona comenten.

http://www.magic-seo-url.com/oscommerce/tips/running-oscommerce-with-register-globals-off.html

 
At 4:50 p. m., Blogger Stephan dijo...

Alan G. WebDesigner dijo...

LA SOLUCIÓN!!!!!!!!!!!!!


http://www.magic-seo-url.com/oscommerce/tips/running-oscommerce-with-register-globals-off.html



ESTO ME FUNCIONO PERFECTAMENTE... TE FELICITO COMPADRE, ES REALMETE SORPRENDENTE, REALICE TODOS LOS ASOS EN EL SITIO Y ME FUNCIONO A LA PERFECCIóN...

CUAL QUIER PREGUNTA MI CORREO ES :
stephanpardo@gmail.com

 
At 6:22 p. m., Blogger David Bernad dijo...

Hola.
A mí no me ha funcionado, sigue mostrándome el mismo mensaje de error, es como si no hubera hecho nada, ningún cambio, ni positivo ni negativo.

 
At 12:47 a. m., Blogger daosorio dijo...

Tenía el mismo problema, y solo agregué la siguiente línea en el file .htacces:

php_flag register_globals on

y listo!

Espero les sea de utilidad.

Saludos cordiales.

 

Publicar un comentario

<< Inicio