Foros del Web » Programando para Internet » PHP »

variables superglobales pros y contras

Estas en el tema de variables superglobales pros y contras en el foro de PHP en Foros del Web. cada vez que un usuario se mete en mi web.......hay un par de variables.......que empiezan a rondar por todas las funciones, metodos etc........es decir, a ...

  #1 (permalink)  
Antiguo 11/03/2008, 05:41
 
Fecha de Ingreso: octubre-2007
Mensajes: 394
Antigüedad: 16 años, 6 meses
Puntos: 2
variables superglobales pros y contras

cada vez que un usuario se mete en mi web.......hay un par de variables.......que empiezan a rondar por todas las funciones, metodos etc........es decir, a todas las funciones que voy llamando siempre tienen que ir esos dos parametros........la verdad que tampoco me cuesta mucho mandarlos pero se me ha ocurrido que igual hay alguna forma de poner esas dos variables como superglobales y asi igual se ahorra tiempo de procesamiento o algo....

que opinais? se puede hacer eso? como ser haria? que gano y que pierdo?


Un saludo y gracias,
  #2 (permalink)  
Antiguo 11/03/2008, 06:20
Avatar de spider_boy  
Fecha de Ingreso: diciembre-2003
Ubicación: Chile
Mensajes: 1.855
Antigüedad: 20 años, 4 meses
Puntos: 89
Re: variables superglobales pros y contras

¿Has pensado en usar sesiones? Así no tendrías que pasarlas cómo parámentros entre función y función...
  #3 (permalink)  
Antiguo 11/03/2008, 06:54
 
Fecha de Ingreso: marzo-2008
Ubicación: Venezuela
Mensajes: 60
Antigüedad: 16 años, 1 mes
Puntos: 0
Re: variables superglobales pros y contras

cierto, es mejor que uses sesiones o, en todo caso, cookies (pero aquí viene el rollo de que hay gente que las inhabilita o por cuestiones corporativas no puede deshabilitarlas). la cuestión es que las variables globales son un híbrido que tiende a desaparecer (además del hueco de seguridad que teóricamente implica), por lo que no vale la pena usarlas.
  #4 (permalink)  
Antiguo 11/03/2008, 07:53
 
Fecha de Ingreso: mayo-2006
Mensajes: 120
Antigüedad: 18 años
Puntos: 3
Re: variables superglobales pros y contras

Y sí, las variables globales casi siempre se utilizan como una forma de optimización. Sus contras son que polulan el espacio de nombres y permiten que muchas funciones que en realidad no necesitan modificar las variables, las modifiquen.

Fijate quizá podes hacer una clase singleton con un arreglo como miembro que te permita insertar y borrar variables, pero que no te permita modificarlas sin tirar una excepción. Así ganas la comidad de las variables globales pero forzosamente tenes que borrarla antes de modificarle el valor, a mi me resulta bastante útil.

Saludos.
__________________
programación php
  #5 (permalink)  
Antiguo 11/03/2008, 08:45
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: variables superglobales pros y contras

A ver, estamos hablando de cosas diferentes.

Por un lado tenemos matrices superglobales predefinidas. Esto quiere decir que estarán disponibles en cualquier parte del script. Automáticamente son declaradas como globales. (a saber: $_SERVER, $_POST, $_FILES, $_GET, $_SESSION, $_ENV, $_COOKIES, $GLOBALS, $_REQUEST).

Si register_globals está en ON, los índices de las matrices EGPCS (Entorno, GET, POST, Cookie, Servidor) pasarán a ser variables propiamente dichas. Ese es el gran problema de seguridad que más arriba refieren.

La pregunta específica es como hacer que una variable global del script esté también disponible en el ámbito local de una función o un objeto. Esto no tiene que ver directamente con el uso de register_globals. Hay varias formas de hacerlo. Una compleja (no porque sea difícil, sino porque hay que incluirla en cada función del script) y que ya no se recomienda, es hacerla global dentro de cada función de tu script:

Código PHP:
function algo() {
    global 
$variable1$variable2;
    
# ....

Otra, más sencilla, es usando una de las matrices superglobales que te mencioné arriba. La matriz $GLOBALS contiene referencias a todas y cada una de las variables definidas en el contexto global del script. Podrías usarla para llamar a las variables deseadas:

Código PHP:
function algo() {
    echo 
$GLOBALS['variable1'];
    echo 
$GLOBALS['variable2'];
    
# ....

Algunas cosas que aclarar. La matriz $GLOBALS es automáticamente definida como global, independientemente del valor de register_globals. SIn embargo hay otras directivas en el php.ini que pueden impedir que esta variable sea definida automáticamente como global. Además, como dije más arriba, esta matriz contiene puras referencias. Esto quiere decir que cualqueir cambio aplicado a cualquiera de sus elementos será en realidad aplicado a la variable original:

Código PHP:
$v "a";
 
function 
dd() {
    
$GLOBALS['v'] = "b";
}
 
echo 
$v# a
 
echo "<br>";
 
dd();
 
echo 
$v# b 
Saludos,
  #6 (permalink)  
Antiguo 12/03/2008, 03:17
 
Fecha de Ingreso: octubre-2007
Mensajes: 394
Antigüedad: 16 años, 6 meses
Puntos: 2
Re: variables superglobales pros y contras

Vale, gracias a todos por las respuetas. Yo lo que quiero vas mas orientado a la matriz GLOBALS, ya que no quiero que una variable perdure durante una sesion si no que.........en cada ejecucion de un script, es decir, cada peticion al servidor de un usuario, se generaran justo al principio unas variables (2 o 3) que estaran rondando por muchas funciones y sitios DURANTE ESA EJECUCION DEL SCRIPT. En cada ejecucion de script (bien sea del mismo usuario o de otro) se generaran esas variables, las cuales no tienen porque tener el mismo valor, por tanto SESSION no me vale.

Ahora la cosa es....veis recomendazble y productivo que utilice la matriz superglobal GLOBAL? que tiene de bueno y que de malo? ya se que uno de los peligros es que cualquiera podra modificar dicha variable (pero bueno, para mi eso no es problema ya que todo el mundo la usara....xo ya me encargare yo de que ninguna fucnion la modifique xD)

En resumen, como lo hariais? mando como parametro todo el rato esas dos variables? o las meto en esa matriz milagrosa y que cada uno la coja cuando la necesite?

Un saludo
  #7 (permalink)  
Antiguo 12/03/2008, 10:11
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: variables superglobales pros y contras

Si necesitas que sea global, pues usa la matriz $GLOBALS para eso fue diseñada, en cambio si no te interesa usar ese tipo de elementos, envía los valores por parámetros o usa una clase Registro (busca el patrón Registry en Google).

Saludos.
  #8 (permalink)  
Antiguo 12/03/2008, 10:56
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Re: variables superglobales pros y contras

Perdon la intromision pero por que en PHP las variables globales se declaran en todas las funciones que las usan y no afuera como en Visual Basic, ... por ejemplo ?

gracias y perdon x usar el hilo
__________________
Salu2!
  #9 (permalink)  
Antiguo 12/03/2008, 12:43
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: variables superglobales pros y contras

@Italico76, poco conozco sobre el lenguaje de Visual Basic, pero trataré de aclarar tu duda con lo que sé de la manera en que PHP toma las variables.

Tenemos dos ámbitos en términos generales, uno global, en el script, incluyendo los incluidos y requeridos; y otro local, en las funciones. Las variables declaradas en el ámbito global no estarán declaradas ni disponibles en un ámbito local, ni viceversa. Es por eso que si queremos usar una variable de ámbito global en un contexto local debemos antes declararla como global en el contexto de la función (OJO, sólo en el contexto de esa función). La forma es:
Código PHP:
$var "Ámbito Global";
 
function 
algo() {
    
# Requerimos la variable $var
    
global $var;

De esta manera hacemos manipulable la variable deseada en un contexto diferente de en el que fue declarada. Otro método es usando la matriz $GLOBALS, que, junto con otras, es conocida como superglobal puesto que siempre estará disponible en cualquier contexto del script.

Se puede habla mucho sobre las variables y sus ámbitos, y los modificadores que intervienen en éstos ámbitos, pero mejor... el manual de PHP

http://www.php.net/manual/es/languag...bles.scope.php

Un saludo,
  #10 (permalink)  
Antiguo 13/03/2008, 08:08
 
Fecha de Ingreso: octubre-2007
Mensajes: 394
Antigüedad: 16 años, 6 meses
Puntos: 2
Re: variables superglobales pros y contras

mmm ahora me surge una duda .....que diferencia hay entre $GLOBALS y _$GLOBALS ? porque yo he probado a usar $_GLOBALS y no me pasa lo que comenta okram...........

Cita:
$v = "a";

function dd() {
$GLOBALS['v'] = "b";
}

echo $v; # a

echo "<br>";

dd();

echo $v; # b
a mi me las pilla como variables totalmente diferentes.............tendra algo que ver que tenga register_globals a OFF?
  #11 (permalink)  
Antiguo 13/03/2008, 09:51
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: variables superglobales pros y contras

$_GLOBALS no es una variable definida, esa tu la puedes usar si quieres, la variable correcta es $GLOBALS sin el guión bajo.

Saludos.
  #12 (permalink)  
Antiguo 13/03/2008, 09:54
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Re: variables superglobales pros y contras

okram: gracias!
__________________
Salu2!
  #13 (permalink)  
Antiguo 13/03/2008, 12:15
 
Fecha de Ingreso: octubre-2007
Mensajes: 394
Antigüedad: 16 años, 6 meses
Puntos: 2
Re: variables superglobales pros y contras

que quiere decir que $_GLOBALS no sea una matriz definida? esa matriz no es global a todo?

por otro lado.......si uso $GLOBALS no ai alguna forma de que no pase lo que dice okram?es decir, si yo hago:

$GLOBALS['var1]=5
y luego $var1=10;

a mi no me interesaria que la variable de dentro de $GLOBALS se modifique
hay alguna forma de hacerlo?
  #14 (permalink)  
Antiguo 13/03/2008, 12:36
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: variables superglobales pros y contras

No, $_GLOBALS no es registrada por PHP para nada, la variable correcta es usar $GLOBALS.

Prueba este código:
Código PHP:
$var1 50;

function 
prueba() {
      
$GLOBALS['var1'] += 10;
      
$var1 10;

     echo 
"Valor de \$var1 (local): $var1";
}

prueba();
echo 
"Valor de \$var1 (global): $var1"
Podrás ver que solo si modificas dentro de $GLOBALS se modifica la variable, tu puedes usar $var1 en tu función local sin problema.

Saludos.
  #15 (permalink)  
Antiguo 13/03/2008, 13:41
 
Fecha de Ingreso: octubre-2007
Mensajes: 394
Antigüedad: 16 años, 6 meses
Puntos: 2
Re: variables superglobales pros y contras

buenos ps igual lo que hago es usar la variable $GLOBALS y tener mucho cuidado de en ningun sitio cambiar el nombre de dichas variables. Aunque se me ha ocurrido que si alguien por url (por GET) me manda var1=55 tambien me modificaria $GLOBALS['var1'] ? teniendo en cuenta que tengo register_globals a OFF.

Un saludo,
  #16 (permalink)  
Antiguo 13/03/2008, 14:54
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: variables superglobales pros y contras

@Blade_Storm, si register_globals está en off, no tendrías ese problema.

Verás, la directiva register_globals (en ON) hace que las variables pasadas por GET, POST, etc. (EGPCS) sean declaradas automáticamente, pudiendo ser accedidas sin necesidad de usar la matrices superglobales, osea, si yo entro a pagina.php?var=valor, en pagina.php podria poner
Código PHP:
echo $var# Imprime "valor"
 
// o lo que es lo mismo
 
echo $GLOBALS['var']; # Imprimer "valor"; 
Si tienes register_globals en OFF, no podrás acceder esas variables así, sino que tendrás que usar las matrices predefinidas superglobales:
Código PHP:
echo $_GET['var']; # Imprime "valor" 
Incluso podrías poner
Código PHP:
echo $GLOBALS['_GET']['var']; # Imprime "valor" 
Aunque no tendría razón de ser, puesot que $_GET en sí ya es una variable global y se propaga a todos los ámbitos en el script, y no es necesario asociarla con $GLOBALS.

Ahora, para ver exactamente qué es lo que contiene esta variable $GLOBALS prueba poniendo en un script cualquiera:

Código PHP:
echo "<pre>" print_r($GLOBALS1) . "</pre>"
Lee algo más sobre la directiva register_globals

Saludos,

Última edición por okram; 13/03/2008 a las 15:03
  #17 (permalink)  
Antiguo 13/03/2008, 15:35
Avatar de jaronu  
Fecha de Ingreso: febrero-2008
Mensajes: 2.183
Antigüedad: 16 años, 2 meses
Puntos: 52
Re: variables superglobales pros y contras

Perdon que me una al hilo, pero lo vengo siguiendo desde el principio y me interesa el tema.

Yo tengo register_globals en ON, entonces entiendo que me puede pasar lo que okram comenta en el post anterior:

Cita:
Verás, la directiva register_globals (en ON) hace que las variables pasadas por GET, POST, etc. (EGPCS) sean declaradas automáticamente, pudiendo ser accedidas sin necesidad de usar la matrices superglobales, osea, si yo entro a pagina.php?var=valor, en pagina.php podria poner
vamos, que podrian modificar mis variables, pero peregunto, ¿deberian de conocer el nombre exacto de las variables que uso en los scripts? ¿podrian hacer eso?
  #18 (permalink)  
Antiguo 13/03/2008, 15:38
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: variables superglobales pros y contras

No lo sé, puede que sí, aunque lo más probable es que quien sabe ... El punto es que... para qué arriesgarse?

Saludos
  #19 (permalink)  
Antiguo 13/03/2008, 15:45
 
Fecha de Ingreso: octubre-2007
Mensajes: 394
Antigüedad: 16 años, 6 meses
Puntos: 2
Re: variables superglobales pros y contras

mmmm gracias......

jaronu respecto a lo tuyo...........nunca he entendido la utilidad de register_globlals a ON..... a mi parecer solo puede darte problemas..........

y respecto a lo que dices de que alguien debe conocer el nombre exacto de tus variables............mmmm ai gente que se dedica a eso.....a tocar los huevecillos (lo pongo en modo cariñoso) y a buscar ese tipo de "bugs" en las aplicaciones. Asi que bastantes problemas podemos tener con PROBLEMAS DESCONOCIDOS, como para encima los pocos que conocemos (al menos en mi caso) no solucionarlos a tiempo.

Un saludo
  #20 (permalink)  
Antiguo 13/03/2008, 15:51
Avatar de jaronu  
Fecha de Ingreso: febrero-2008
Mensajes: 2.183
Antigüedad: 16 años, 2 meses
Puntos: 52
Re: variables superglobales pros y contras

Entonces lo mejor es tener register_globals en off, y recuperar las variables por GET

echo $_GET['var']; ???

yo ya las recupero con GET, pero claro, ahora leyendo los post lo mismo puedo hacer

echo $var;

que hacer

echo $_GET['var']; Lo mismo me daria.

Me pondre en contacto con mi hosting para que me lo cambien, pero como el servidor es compartido, vete tu a saber si lo querran hacer.

Gracias por la respuesta, Me interesa todo lo relacionado con la seguridad de los script y la BD.

lo que pasa es que el enlace que dejaste arriba, okram, no se por que misterio no se me carga en el navegador.

Un saludo.
  #21 (permalink)  
Antiguo 13/03/2008, 16:07
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: variables superglobales pros y contras

Sobre el enlace, es el manual de PHP al que te estoy enviando, prueba con otro mirror:

http://mx.php.net/manual/es/security.globals.php

Y sobre el register_globals en tu hosting, puedes cambiarlo localmente con un archivo .htaccess ubicado en el directorio raiz de tu servidor, con esta linea:

Código:
php_flag register_globals off 
Desde la versión 6 de PHP ya no existirá la directiva register_globals, y desde PHP4 el valor por defecto en el php.ini es off.

Saludos,
  #22 (permalink)  
Antiguo 13/03/2008, 16:20
Avatar de jaronu  
Fecha de Ingreso: febrero-2008
Mensajes: 2.183
Antigüedad: 16 años, 2 meses
Puntos: 52
Re: variables superglobales pros y contras

Gracias okram, siempre aclarando muy bien las dudas,

no se crar un archivo .htaccess , no se si puedo usar dream para hacerlo, o si .htaccess , es la extension y llamarlo como sea, vamos que no tengo idea, pero me voy al buscador del foro que seguro encuentro como se hace el archivo.

Un saludo
  #23 (permalink)  
Antiguo 13/03/2008, 16:26
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: variables superglobales pros y contras

El archivo lo puedes crear con notepad, aunque luego Windows tiene problemas con este archivo ya que no tiene nombre y solo tiene extension.

Saludos.
  #24 (permalink)  
Antiguo 13/03/2008, 16:42
Avatar de jaronu  
Fecha de Ingreso: febrero-2008
Mensajes: 2.183
Antigüedad: 16 años, 2 meses
Puntos: 52
Re: variables superglobales pros y contras

lo he creado con Dream y no he tenido problemas para nombrarlo .htacces
pero ejecuto un archivo que tengo con

phpinfo ()

y al mirar de nuevo la configuracion del php.ini sigue igual,

register_globals en ON

eso ha de ser asi? y solo con poner el .htacces se cammbia a OFF aunque aparezca en ON en el pfpinfo()

Gracias.
  #25 (permalink)  
Antiguo 13/03/2008, 16:54
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: variables superglobales pros y contras

Entonces tu servidor no soporta comandos vía el .htaccess, por lo que tendrás que contactarlos y pedirles que te pasen el register_globals a Off.

Saludos.
  #26 (permalink)  
Antiguo 13/03/2008, 16:58
Avatar de jaronu  
Fecha de Ingreso: febrero-2008
Mensajes: 2.183
Antigüedad: 16 años, 2 meses
Puntos: 52
Re: variables superglobales pros y contras

Gracias GatorV

Ya les he mandado un ticket de soporte que tengo con ellos, es 24 horas, pero seguro que el que esta de guardia, esta noche, no tiene ni idea de php y por eso no me contestan, ya lo haran mañana, espero.

Gracias por responder.

Un saludo.
  #27 (permalink)  
Antiguo 13/03/2008, 17:01
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: variables superglobales pros y contras

Sólo aclarar que el tema de los .htaccess con tiene que ver directamente con PHP, sino con el servidor Apache

Saludos.
  #28 (permalink)  
Antiguo 14/03/2008, 06:55
Avatar de jaronu  
Fecha de Ingreso: febrero-2008
Mensajes: 2.183
Antigüedad: 16 años, 2 meses
Puntos: 52
Re: variables superglobales pros y contras

Hola de nuevo,

Me han comunicado esta mañana los del servicio de hosting, sobre el tema de que cambiaran las register_globals a OFF, y dicen que es recomendable que esten en ON y que si lo cambian afectaran a mas portales de su hosting y no solo a mi.

lo de que afectara a mas gente y eso lo comprendo, pero es que ellos recomiendan que esten en ON.

Y Ya que no lo puedo cambiar, existe alguna forma de proteger las variables de los scripts de alguna otra forma?

Gracias.
  #29 (permalink)  
Antiguo 14/03/2008, 09:17
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: variables superglobales pros y contras

Si te están diciendo que lo recomendable es On, te están mintiendo ya que es un problema de seguridad y la razón por la que lo dejan en On es porque la mayoría de los scripts para PHP3/4 se programaron pensando en register_globals, y si lo pasan a Off afectarían a todo su hosting es por eso que no lo hacen.

Puedes usar este pequeño script para "limpiar" las variables:
Código PHP:
if (ini_get('register_globals')) {
    
$rg array_keys($_REQUEST);
    foreach(
$rg as $v) {
        if (
$_REQUEST[$v] === $$v) {
            unset($
$v);
        }
    }
    unset(
$rg);
}

if (
get_magic_quotes_gpc()) {
    
$in = array(&$_GET, &$_POST, &$_COOKIE);
    
    while (list(
$k,$v) = each($in)) {
        foreach (
$v as $key => $val) {
            if (!
is_array($val)) {
                
$in[$k][$key] = stripslashes($val);
                continue;
            }
            
$in[] =& $in[$k][$key];
        }
    }
    unset(
$in);

Saludos.
  #30 (permalink)  
Antiguo 14/03/2008, 10:36
Avatar de jaronu  
Fecha de Ingreso: febrero-2008
Mensajes: 2.183
Antigüedad: 16 años, 2 meses
Puntos: 52
Re: variables superglobales pros y contras

Gracias GatorV, guardare bien ese script.

Lo que creia es que cada uno teniamos un php.ini como diria, PARTICULAR, el cual se podia modificar segun las necesidades, pero me doy cuenta de que eso debe ser solo en local o si tienes tu propio server.

Gracias, empezare a implementar el codigo en mis scripts.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:23.