Foros del Web » Programando para Internet » PHP »

Seguridad de sesiones

Estas en el tema de Seguridad de sesiones en el foro de PHP en Foros del Web. Cluster, en uno de los temas hablas de que usar session_register es un metodo muy inseguro. Al leer eso fui al sitio de PHP a ...
  #1 (permalink)  
Antiguo 25/02/2005, 04:55
Avatar de walo  
Fecha de Ingreso: mayo-2004
Mensajes: 310
Antigüedad: 13 años, 6 meses
Puntos: 0
Seguridad de sesiones

Cluster, en uno de los temas hablas de que usar session_register es un metodo muy inseguro. Al leer eso fui al sitio de PHP a buscar info y me encontre con

Ejemplo 4. Registrar una variable con register_globals activado

Código PHP:
    <?php
 
if (!session_is_registered('count')) {
     
session_register("count");
     
$count 0;
 }
 else {
     
$count++;
 }
 
?>
Mi pregunta es... por que session_register es un metodo inseguro ?
Tengamos en cuenta que la gran mayoria de los servidores estan configurados con
track_vars = 1
register_globals = 1

Este es otro texto del sitio de php

Nota: A partir de PHP 4.1.0, $_SESSION está disponible como variable global, al igual que $_POST, $_GET, $_REQUEST y demás. Al contrario que $HTTP_SESSION_VARS, $_SESSION siempre es global. Por tanto, no se debe usar global para $_SESSION.

Última edición por walo; 25/02/2005 a las 05:56
  #2 (permalink)  
Antiguo 25/02/2005, 07:09
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
En realidad lo que es "inseguro" no es registrar tu variable de sesión por la función: session_register() .. sino el acceso "global" que haces de ella "$count" .. en su defecto deberías usar $HTTP_SESSION_VARS ...

Te comento un caso (aunque ya lo comenté en su tiempo y lo dejé como FAQ de las primeras de este foro PHP) ..

Con register_globals a ON (1) .. Puedo hacer:

nose.php?count=1

para "suplantar" el valor de una variable de sesión (que debe tomar su valor del "servidor") por algo que ingrese por el URL como ese caso ya que al usar register_globals a ON no discrimina PHP sobre por donde o que método entra tu variable al script (es aplicable a otros métodos como POST, cookies .. etc).

Si bien con la función session_is_register() ese problema tal vez se solucione (podrías probarlo y nos comentas) .. muchooooos programadores hacen cosas como:

Código PHP:
session_start();
session_register("autentificado")
$autentificado="SI" 
y de ahí en otro script hacen

Código PHP:
session_start();
if (
$autentificado == "SI"){
   echo 
"Hola .. estas autentificado . .que bien .. urra!";

Cuando usas el array superglobal $_SESSION .. te hace independiente de si usas register_globals a ON o a OFF (1 o 0) .. cosa que usarlo como "$count" sólo se puede usar bajo register_globals a ON .. (no hay que pensar en "promedios" si tales configuraciones lo usan a ON .. falta ese que se sale del promedio o standard y tu aplicación no funcionará).

A futuro .. session_register() y todo el grupo de funciones de ese estilo desapareceran (es probable) .. pues si te fijas .. ahora si te bajas cualquier versión actual de PHP . .por defecto (desde la versión 4.2.x aprox.) la directiva: register_globals .. viene a OFF (0) para que te "acostumbres" a ese trabajo con variables externas "seguro" donde discrimines por el método que llegan tus variables y no confundir o "suplantar" el método que esperas por donde llega esa variable.


Fijate en la versión en ingles del manual oficial de PHP sobre el tema sesiones .. no tienen esos ejemplos ya con session_register y demás .. alegando este parrafo:

Cita:
Use of $_SESSION (or $HTTP_SESSION_VARS with PHP 4.0.6 or less) is recommended for improved security and code readability. With $_SESSION, there is no need to use the session_register(), session_unregister(), session_is_registered() functions. Session variables are accessible like any other variables.
http://www.php.net/manual/en/ref.session.php

El tema que comentas de
Cita:
Nota: A partir de PHP 4.1.0, $_SESSION está disponible como variable global, al igual que $_POST, $_GET, $_REQUEST y demás. Al contrario que $HTTP_SESSION_VARS, $_SESSION siempre es global. Por tanto, no se debe usar global para $_SESSION.
Eso se refiere al "ambito" de las variables .. en general .. de hecho es válido para todo array superglobal .. Ejemplo:

Usando $HTTP_SESSION_VARS .. si tu lo pretendes acceder -dentro- de una función .. no pudras hacerlo "globalmente" si no lo defines como tal o se lo pasas como parámetro:

Código PHP:
function nose(){
global 
$HTTP_SESSION_VARS
echo $HTTP_SESSION_VARS['nose'];

Mientras que con los arrays "superglobales" .. puedes hacer:

Código PHP:
function nose(){
echo 
$_SESSION['nose'];

Por qué es "global" .. es decir, tiene todo ambito en el script que se está ejecutando (+ en toda la aplicación y sesión activa .. pues es una sesión .. ).


Un saludo,

Un saludo,
  #3 (permalink)  
Antiguo 25/02/2005, 07:17
 
Fecha de Ingreso: febrero-2005
Mensajes: 396
Antigüedad: 12 años, 10 meses
Puntos: 1
Gracias Cluster por la explicación. Pese a que yo nunca he incurrido en uno de los problemas de seguridad que comentas, ya que siempre he usado correctametne $_SESSION me has descrito una fuente potencial de problemas interesante.

Un saludo

Zerjillo
  #4 (permalink)  
Antiguo 25/02/2005, 07:19
Avatar de walo  
Fecha de Ingreso: mayo-2004
Mensajes: 310
Antigüedad: 13 años, 6 meses
Puntos: 0
Antes que nada, gracias por tu extendida respuesta...

La verdad es que siempre use el session_register() por que es lo primero que aprendi y desde que crearon el register_globals SIMEPRE lo use en off.

Es verdad que no todos lo tienen en off, de hecho muchisimos servidores al compilar php lo ponen en "on" para evitar que sus usarios con scripts viejos tengan problemas.

Igualmente creo que alguien que programa php deberia saber fundamentos de seguridad, aunue sea, lo basico.

De todas formas voy a empezar a usar $HTTP_SESSION_VARS

Saludos !
  #5 (permalink)  
Antiguo 25/02/2005, 10:59
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
La verdad es que siempre use el session_register() por que es lo primero que aprendi y desde que crearon el register_globals SIMEPRE lo use en off.
supongo que será un "lapsus" .. donde dices off .. es ON (1) ...

Cita:
Es verdad que no todos lo tienen en off, de hecho muchisimos servidores al compilar php lo ponen en "on" para evitar que sus usarios con scripts viejos tengan problemas.
Eso es cierto .. por eso te hacía el comentario que al usar $_SESSION (el array superglobal) no depende del valor de dicha directiva .. da igual si está a ON o a OFF .. siendo más seguro si se usa a OFF si cabe.

Cita:
De todas formas voy a empezar a usar $HTTP_SESSION_VARS
Eso minimo (en tu caso que usas session_register()) .. Pero intenta para los desarrollos nuevos que tengas que hacer usar $_SESSION y ese estilo de programación de sesiones que .. por lo demás no es "nuevo" se puede usar desde PHP 4.1.x aprox. (y de esto hace ya un par de años? .. ahora no recuerdo .. ).

Un saludo,
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 20:08.