Autor
|
Tema: Duda para manejar variables cuando 'register_globals=off' !! (Leído 12,536 veces)
|
Diabliyo
Desconectado
Mensajes: 1.441
shell# _
|
Hola: De un tiempo buen tiempo aca casi todos los hosting que ofrecen soporte de PHP poseen la configuracion de register_globals=off, por lo cual varias aplicaciones que he realizado en PHP he tenido que modificarlas para que funcionen !!... Pero me he topado con un PROBLEMON , el cual va asi: En una aplicacion que realize es indispensable tener a la mano un conjunto de variables para conectarme a la base de datos (mysql), en donde dichas variables las tenia dentro de un archivo *.php, asi que, cuando el usuario cambia sus PASSWORDS (ya sea del PANEL DE CONTROL o BASE DE DATOS) antes lo unico que hacia era abrir el archivo (fopen) config.php y escribia la informacion, de tal manera que el archivo quedaba asi (NOTA: es solo un ejemplo): //Archivo: config.php
<?php $user= "usuario"; $pass= "password"; $user_db= "userdb"; $pass_dv="passdb"; $server= "nombre"; $base_dd= "nombre_base_de_datos"; ?> Y pues actualmente este archivo de configuracion NO funciona , debido a la configuracion de 'register_globals=off'... ' Uso de Variables GLOBALES desactivado'.... Ahora he tenido que realizar la carga de variables de esta forma: //Nuevo archivo: config.php
<?php define( USER, "" ); define( PASS, "" ); //etc, etc... ?> Mi problema es que: no enccuentro la forma para que de cierta manera el usuario al momento de instalar la aplicacion, escribir la informacion en dichas variables SIN necesidad de realizar la apertura de archivo directamente (fopen)... Alguien podria decirme alguna forma que pueda realizar la escritura en dicho archivo config.php ???... Otra cosa, es conveninete el uso de variables definidas de esa forma ?? Gracias por su atencion !! bye bye
|
|
|
En línea
|
|
|
|
Universal SAC
Desconectado
Mensajes: 41
Universal SAC
|
De verdad que no entiendo el problema... considero que es más facil dejar el archivo de configuración tal cual, pero modificar el archivo que recoge los datos para insertarlos (en config.php). Tan solo definir si vienen de forma POST (u otros, dependiendo tu aplicación).
Además te evitas que tengas problemas nuevamente al cambiar de configuración el php. Saludos.
|
|
|
En línea
|
|
|
|
Diabliyo
Desconectado
Mensajes: 1.441
shell# _
|
De verdad que no entiendo el problema... considero que es más facil dejar el archivo de configuración tal cual, pero modificar el archivo que recoge los datos para insertarlos (en config.php). Tan solo definir si vienen de forma POST (u otros, dependiendo tu aplicación).
Además te evitas que tengas problemas nuevamente al cambiar de configuración el php. Saludos.
No companero, no entiendes el problema.... El problema es que las variables GLOBALES no pueden ser utilizadas en PHP... pondre un ejemplo de variables GLOBALES. //Este era el config.php
//Archivo: config.php
<?php $user= "usuario"; $pass= "password"; $user_db= "userdb"; $pass_dv="passdb"; $server= "nombre"; $base_dd= "nombre_base_de_datos"; ?> //pagina que utilizaba el archivo config.php
<?php incluse( "config.php" ); //incluimos las variables para utilizarlas en todas partes incluse( "funciones_bbb.php" ); //aqui estaran las funciones que utilizaran variables globales ?>
<html> <head> <title>PAGINA</title> </head>
<body> <?php if( ($link= conectar()) == "ERROR" ) echo "Problemas para conectar.."; else echo "Conexion exitosa..."; ?> </body> </html> En ese codigo... imprimira la pagina: " Problemas para conectar..."... Ya que las variables establecidas en el archivo config.php no se pueden utilizar, ya que son GLOBALES !!... La solucion para que las variables puedan ser utilizadas, se soluciona modificando las variables como DEFINIDAS, asi... //nuevo config.php
define( user, "usuario" ); define( pass, "password" ); define( user_db, "userdb" ); define( pass_db,"passdb" ); define( server, "nombre" ); define( base_dd, "nombre_base_de_datos" ); La solucion es FACIL, el problema es en si: Como seria mas conveniente modificar el archivo config.php sin necesidad de realizar la apertura normal (fopen) para modificacion (osea, modificacion es CUANDO EL USUARIO desea cambiar sus passwords)... Espero y entiendan como va el asunto !! bye bye
|
|
« Última modificación: 8 Noviembre 2007, 05:40 am por Diabliyo »
|
En línea
|
|
|
|
alone-in-the-chat
Desconectado
Mensajes: 587
|
me parece que si deseas abrirla con fopen directamente debes de poseer permisos de escritura sobre el archivo y tener un config.php con permisos de escritura es peligroso hace tiempo hice un cms (que hasta ahora uso ) la particularidad de el era que creaba los archivos html (por que es mas rapido que se carguen cuando ya estan creados en vez de generarlos en base a los datos de la bd ) en donde le indicases , pero ninguna carpeta tenia permisos de escritura lo que hacia era crear el archivo en temporal luego me conectaba x ftp y lo subia (se que es un poco exagerado , pero me parece mas seguro ) Saludos Edito Eso de conectarse x ftp y subirlo ...... lo hacia el sistema puede que pareciese que hiciese el proceso manualmente
|
|
« Última modificación: 8 Noviembre 2007, 06:38 am por alone-in-the-chat »
|
En línea
|
Because maybe You're gonna be the one that saves me And after all You're my wonderwall d[n_n]b
|
|
|
Universal SAC
Desconectado
Mensajes: 41
Universal SAC
|
Ahh, ya entendí cual es el problema. El problema es que no sabes lo que hace el valor "register_globals". No se trata de evitar las variables globales en los codigos, sino de evitar que las variables globales fueran tomadas (y registradas) desde cualquier forma de entrada de datos. Osea que si alguien enviaba la variable OK como post, o como get, o como cookie... modificaría el valor de la variable $ok de tu codigo. (eso es con register_globals activado). Y ahora con register_globals desactivado, las variables globales vienen con una sintaxis más completa y estricta, si envian OK por get, el valor estará en $_GET['ok'] y será diferente a una variable global $ok que tengas en el código. Por lo que el último ejemplo que colocaste, se soluciona agregando en la función conectar() (que deduzco se encuentra en "funciones_bbb.php") una linea de este tipo: global $user, pass, $user_db; //y todas las que quieras Quedando así: //en funciones_bbb.php function conectar(){ global $user_db,$pass_dv,$server,$base_dd; $con=mysql_connect($server,$user_db,$pass_dv); $link=mysql_select_db($base_dd,$con); return $link } Saludos EDITO: Si es necesario, también hay que declarar las variables como globales en config.php. En mi caso, no fue necesario...
|
|
« Última modificación: 8 Noviembre 2007, 06:24 am por Universal SAC »
|
En línea
|
|
|
|
Diabliyo
Desconectado
Mensajes: 1.441
shell# _
|
Ahh, ya entendí cual es el problema. El problema es que no sabes lo que hace el valor "register_globals". No se trata de evitar las variables globales en los codigos, sino de evitar que las variables globales fueran tomadas (y registradas) desde cualquier forma de entrada de datos. Osea que si alguien enviaba la variable OK como post, o como get, o como cookie... modificaría el valor de la variable $ok de tu codigo. (eso es con register_globals activado). Y ahora con register_globals desactivado, las variables globales vienen con una sintaxis más completa y estricta, si envian OK por get, el valor estará en $_GET['ok'] y será diferente a una variable global $ok que tengas en el código. Por lo que el último ejemplo que colocaste, se soluciona agregando en la función conectar() (que deduzco se encuentra en "funciones_bbb.php") una linea de este tipo: global $user, pass, $user_db; //y todas las que quieras Quedando así: //en funciones_bbb.php function conectar(){ global $user_db,$pass_dv,$server,$base_dd; $con=mysql_connect($server,$user_db,$pass_dv); $link=mysql_select_db($base_dd,$con); return $link } Saludos EDITO: Si es necesario, también hay que declarar las variables como globales en config.php. En mi caso, no fue necesario... Nop.... La unica diferencia que existe al tener register_globals activado o desactivado, es que: register_globals= onLas variables que se transportan de una pagina hacia otra (ejemplo: un formulario), pueden ser consultadas directamente: echo $variable; y estaran disponibles en las funciones que invoques... register_globals= offLas variables que se transportan de una pagina hacia otra (ejemplo: un formulario), podran ser consultadas siempre y cuando el formulario este en method=POST, y seran accesibles por $_POST["variable"], posteriormente las variables invocadas desde un enlace (<a href="variable=X">), seran tratadas con $_GET["variable"] y estas NO trascenderan hacia las otras hojas. Por lo que, si creas un archivo .php el cual INCLUYES despues, las variables que tengas en dicho ARCHIVO PHP (config.php) no estaran disponibles dentro de las FUNCIONES !!... Nose si me entiendas o sabes un poco de variables GLOBALES y NO GLOBALES.... Una variable global esta disponible en TODAS partes (siempre y cuando este incluida al inicio).... Una variable no global solo estara disponible dentro del pedazo de codigo en donde se invoco la variable, y si accedes a una FUNCION, las variables no existiran debido a que son solo LOCALES. En conclusion, declarar: global $user, pass, $user_db; Es un poco anti etico, debido a que las variables GLOBALES son PELIGROSAS en cuestiones de INYECCION/EXTRACCIO DE CODIGO... En cambio, una variable DEIFNIDA es como una varable ESTATICA, la cual se diferencia poque no tiene el simbolo de $ al inicio...
|
|
|
En línea
|
|
|
|
Universal SAC
Desconectado
Mensajes: 41
Universal SAC
|
Confiezo que soy novatón y que seguramente eres más habilidoso que yo para programar en php... pero en este caso específico creo que la solución que te ofresco es buena y correcta. De hecho, he probado (hace unos segundos) la inyección de código o el reemplazo del valor de una variable global teniendo register_globals en ambas modalidades. Únicamente lo logré estando ON, probé con GET, POST, COOKIES y un formulario sin específicar método. Por lo que: Es un poco anti etico, debido a que las variables GLOBALES son PELIGROSAS en cuestiones de INYECCION/EXTRACCIO DE CODIGO... ...me atrevo a decir que esto no es posible mientras register_globals=off. Sostengo que la solucíón que di anteriormente, es la más facil y no hay problemas de seguridad con register_globals desactivado. Como último argumento, puedes dejar las variables de config.php como NO GLOBALES (sí, entiendo lo que es global y lo que no, jojo) y pasar su valor como parámetros de la función "conectar". Espero sirva te sirva de algo lo que respondo. Saludos.
|
|
|
En línea
|
|
|
|
Hans el Topo
Desconectado
Mensajes: 1.754
"Estoy cansado de no hacer nada"
|
en parte es como dice SAC
si tienes en off php no te construye variables con los valores de $_SERVER, $_GET, $_POST, $_COOKIE, $_FILES, $_ENV, $REQUEST y $_SESSION si lo tienes a on si lo hace
... no tiene más misterio, lo otro es igual en ambos casos porque no tiene nada que ver
|
|
|
En línea
|
|
|
|
Diabliyo
Desconectado
Mensajes: 1.441
shell# _
|
en parte es como dice SAC
si tienes en off php no te construye variables con los valores de $_SERVER, $_GET, $_POST, $_COOKIE, $_FILES, $_ENV, $REQUEST y $_SESSION si lo tienes a on si lo hace
... no tiene más misterio, lo otro es igual en ambos casos porque no tiene nada que ver
Si tiene mucho que ver, porke las variables se vuelven LOCALES y para transportarlas a una funcion se deben incluir como argumento. Como último argumento, puedes dejar las variables de config.php como NO GLOBALES (sí, entiendo lo que es global y lo que no, jojo) y pasar su valor como parámetros de la función "conectar". Acabas de dar con la RAZON principal mi amigo jejejej.... De echo, como al inicio del post dije, la aplicacion en donde utilizo dicho config.php ya es bastantito GRANDE, de echo creo que serian MUCHAS LAS FUNCIONES que tendria que MODIFICAR (agregarles argumentos) para que tomen los valores de las variables... La solucion al problema seria de dos formas: FORMA 1 (como tu lo planteaste) Utilizando la definicion " global $user, pass, $user_db;", de esta forma las funciones reconoceran los valores. FORMA 2 (modificandolas como define()) Quedarian cada una asi: define( user, "username" );, y habria que modificar el contenido de las funciones, en donde antes era: $user y ahora seria: user. Pero bueno, intentare la forma que me mencions, ya que de echo tengo un algoritmo especial para leer y escribir dentro de los archivos config.php, el cual pues estaba pensando desechar debido a la adopcion de las variables mediante define(). Ahorita les podre code.... bye bye
|
|
|
En línea
|
|
|
|
Diabliyo
Desconectado
Mensajes: 1.441
shell# _
|
Hola:
Estoy detectando que si declaramos: global $var, $var2;, debe ser DENTRO del archivo config.php, por lo cual no es recomendable ya que el SOFTWARE utiliza el archivo config.php para escribir o actualizar la informacion cuando el usuario modifique sus passwords.
Osea que, no lo veo UTIL...
bye bye
|
|
|
En línea
|
|
|
|
|
|