Foros del Web » Programando para Internet » PHP »

Problema con sesiones (quiero sesiones independientes)

Estas en el tema de Problema con sesiones (quiero sesiones independientes) en el foro de PHP en Foros del Web. Hola amigos, Leyendo varios tutoriales sobre sesiones, al final llegué a construirme un modo de autentificar usuarios para una web bastante estándar (creo). Cuando lo ...
  #1 (permalink)  
Antiguo 14/06/2006, 13:38
 
Fecha de Ingreso: septiembre-2005
Mensajes: 94
Antigüedad: 18 años, 6 meses
Puntos: 0
Problema con sesiones (quiero sesiones independientes)

Hola amigos,
Leyendo varios tutoriales sobre sesiones, al final llegué a construirme un modo de autentificar usuarios para una web bastante estándar (creo). Cuando lo implemento en una página web que estoy haciendo, aparentemente funciona bien. Sin embargo, al implementar el mismo mecanismo en otra web y EJECUTAR LAS DOS WEBS A LA VEZ ocurre lo siguiente.Paso a paso:
  1. Ejecuto las dos webs. No me autentifico en en ninguna.
  1. Me autentifico en el sitio1. Puedo entrar en todas las secciones que requieren autentificación
Aquí está el problema:
  1. Sin haberme autentificado en el sitio2, puedo entrar en toda la sección autorizada.

¿Cómo definir varias sesiones independientes, que se ejecuten a la vez?

El código está aquí:


Archivo que se incluye en todas las páginas que quiero acceso restringido:
seguridad.php
Código PHP:
<?
//Inicio la sesión
session_name();
session_start("userid");
if(!(
session_is_registered("userid"))){
    
session_unset();
    
session_destroy();
    
header("Location: acceso.php");
    exit();
}

?>
Código del formulario donde se introducen datos de autentificación:
acceso.php
Código PHP:
<h4 align="center">Acceso identificado:</h4>
                      <form name="form1" method="post" action="accesoControl.php">
                        <p>&nbsp;</p>
                        <table width="80%"  border="0" align="center" cellpadding="2" cellspacing="0">
                          <tr>
                            <td width="50%"><div align="right">nombre:</div></td>
                            <td width="50%"><input name="userid" type="text" id="userid"></td>
                          </tr>
                          <tr>
                            <td width="50%"><div align="right">contrase&ntilde;a:</div></td>
                            <td width="50%"><input name="pwd" type="password" id="pwd"></td>
                          </tr>
                          <tr>
                            <td colspan="2"><div align="center">
                              <br>
                              <input name="Submit" type="submit" id="Submit" value="Entrar">
                            </div></td>
                          </tr>
                          <tr>
                            <td colspan="2">
                            <?
                                
if (isset($_GET['err'])){ ?>
                                      <div class="error">Error: Datos incorrectos</div>
                          <? }?>
                            </td>
                          </tr>
                        </table>
                      </form>


Código que recibe el formulario:
accesoControl.php
Código PHP:
<?
include("includes/conexionBBDD.php");

//Sentencia SQL para buscar un usuario con esos datos
$pwd $_POST["pwd"];
$pwd md5($pwd);
$userid $_POST["userid"];
$ssql "SELECT * FROM admin WHERE nombre='$userid' and pwd='$pwd' ";

//Ejecuto la sentencia
$rs mysql_query($ssql);

//vemos si el usuario y contrase&ntilde;a es váildo
//si la ejecución de la sentencia SQL nos da algún resultado
//es que si que existe esa conbinación usuario/contrase&ntilde;a
if ($row mysql_fetch_array($rs)){
    
//usuario y contrase&ntilde;a válidos
        //defino una sesion y guardo datos
        
session_name();
        
session_start('userid');
        
//session_register("userid"); //no recomendable
        
$_SESSION["userid"]=$userid;
        
//session_encode();
        
$url="Location: admin.php?".SID;
        
header ($url);
    
}else {
    
//si no existe le mando otra vez a la portada

    
header("Location: acceso.php?err=usr");
    exit();
    
}
mysql_free_result($rs);
mysql_close($conn); 
?>

Con todo esto, en cada página restringida, pondría al principio un
include("includes/seguridad.php");


Muchas gracias por vuestra atención y perdonad las molestias.
  #2 (permalink)  
Antiguo 14/06/2006, 14:01
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
NO debes usar la función session_name() sin parámetros .. (a no ser que le hagas un "echo" para ver el nombre de tu sesión actual).

De hecho esto no es correcto:
Código PHP:
//Inicio la sesión 
session_name(); 
session_start("userid"); 
Session_start() no tiene parámetro ni define el nombre de la sesión ..lo hace la función sesion_name() .. sería algo tipo:

Código PHP:
//Inicio la sesión 
session_name('sitio1'); 
session_start(); 
Y el tema de llamar a esa sesión como "userid" tampoco tiene sentido (en el nombre que eso representa), me explico: El "nombre" de la sesión define el "contenedor de variables" de sesión que tu posteriormente iras agregando, modificando su valor o eliminando en forma individual.

Lo "lógico" es que ahí definas un nombre de sesión para esa aplicación y que lo uses en todos los scripts de esa aplicación involucrados con el mismo nombre .. justamente para hacerlos "independientes" de otras aplicaciones que corran en tu mismo servidor SIN uso de sub-dominos y llamados por el mismo cliente (navegador) en forma alternativa o simultánea.

Por otro lado .. propagas el SID en el URL recuerda usarlo en todo link y apertura de página que hagas (en una ventana o frames ...). Lo ideal sería que propagases el SID en cookies por seguridad (www.php.net/session en su versión en ingles para más datos).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 14/06/2006, 15:49
 
Fecha de Ingreso: septiembre-2005
Mensajes: 94
Antigüedad: 18 años, 6 meses
Puntos: 0
Ok, cluster, muchas gracias
lo estudiaré tranquilamente y ya comento algo por aquí.
Gracias!
  #4 (permalink)  
Antiguo 14/06/2006, 17:36
 
Fecha de Ingreso: septiembre-2005
Mensajes: 94
Antigüedad: 18 años, 6 meses
Puntos: 0
Los cambios hechos parece que dan resultados

Hola de nuevo,
Antes de nada, decir que los resultados que obtengo son dentro de mi pc, en el que tengo instalado el AppServ (Apache+Mysql+PHP). Mi SO es WinXP.

Siguiendo tu consejo, he asignado un nombre a la sesión. Aquí reflejo los cambios realizados, por si a alguien le interesa:

Antes de cada session_start() he introducido un session_name("misitio1").

Parece que funciona, ya no hay "conflicto" con las sesiones de otras webs abiertas simultáneamente. Sin embargo, sin propagar el id de sesión por ningún lado, parece que funciona.

Así mismo, he activado y desactivado el
session.use_trans_sid y, el funcionamiento parece el mismo.

Mi pregunta es ¿para qué es necesario propagar la id de la sesión?


En accesoControl.php:
Código PHP:
//es que si que existe esa conbinación usuario/contrase&ntilde;a
if ($row mysql_fetch_array($rs)){
    
//usuario y contrase&ntilde;a válidos
        //defino una sesion y guardo datos
        
session_name("misitio1");
        
session_start();
        
$_SESSION["userid"]=$userid;
    
$url="Location: admin.php";
        
header ($url);
    
}else {
          
//...resto código 
En seguridad.php (es el archivo que comprueba si el usuario que accede es el que se ha identificado):

Código PHP:
<?
//Inicio la sesión
session_name('misitio1');
session_start();
if(!(
session_is_registered('userid'))){
    
session_unset();
    
session_destroy();
    
header("Location: acceso.php");
    exit();
}

?>
  #5 (permalink)  
Antiguo 14/06/2006, 20:14
 
Fecha de Ingreso: septiembre-2005
Mensajes: 94
Antigüedad: 18 años, 6 meses
Puntos: 0
Autenticación usando Cookies en PHP

Bueno, después de un largo rato probando y probando con las cookies, ya parece que he encontrado una solución que funciona y parece tener sentido. Ruego me digáis si hay alguna incoherencia. Por ejemplo, me gustaría saber si es necesario que el nombre de la cookie sea igual al nombre de la sesión. O también ¿Hay que hacer la llamada a session_name(...) y session_start() en todos los momentos que yo la hago, o sobra alguna llamada? El código para autentificar usuarios es el siguiente (pongo el código completo)

Archivo donde se comprueba el usr/pwd introducidos en el formulario:
accesoControl.php
Código PHP:
<?
include("includes/conexionBBDD.php");
//Sentencia SQL para buscar un usuario con esos datos
$pwd $_POST["pwd"];
$pwd md5($pwd);
$userid $_POST["userid"];
$ssql "SELECT * FROM admin WHERE nombre='$userid' and pwd='$pwd' ";

//Ejecuto la sentencia
$rs mysql_query($ssql);

//vemos si el usuario y contrase&ntilde;a es váildo
//si la ejecución de la sentencia SQL nos da algún resultado
//es que si que existe esa conbinación usuario/contrase&ntilde;a
if ($row mysql_fetch_array($rs)){
        
//usuario y contrase&ntilde;a válidos
        //defino una sesion y guardo datos
        
session_name("misitio");
                
session_start();
        
        
//sesión con cookies
        
$nombreCookie 'miCookie';
        
//creamos un número aleatorio entre 0 y el nº de segs del momento actual, y le aplicamos md5
        
$valorCookie md5(rand(0,time()));
        
        
//asignamos una validez a la cookie de 1 hora
        
$tActual time(); //marca de tiempo en segundos
        
$tActualMasUnaHora $tActual 3600 //sumamos 1 hora (3600s)
        
$validezCookie $tActualMasUnaHora;
        
        
//creamos la cookie
        
setcookie($nombreCookie,$valorCookie,$validezCookie);
        
//asignamos un identificador de sesión
        
$_SESSION["sessionID"]=$valorCookie;
        
///////
                //damos acceso al sitio restringido
        
$url="Location: sitioRestringido.php";
                
header ($url);

}else {
    
//si no existe le mando otra vez a la portada
    
header("Location: acceso.php?err=usr");
    exit();
    
}
mysql_free_result($rs);
mysql_close($conn); 
?>

Archivo que hay que incluir al principio de cada .php que queramos restringir
seguridad.php
Código PHP:
<?
//Inicio la sesión
session_name('misitio');
session_start();
$valorCookie $_COOKIE["miCookie"];


if(!(
$_SESSION["sessionID"] == $valorCookie) || 
          !(isset(
$_SESSION["sessionID"]))){
    
session_unset();
    
//destruimos la variable de sesión
    
$_SESSION= array();
    
//destruimos la posible cookie
    
setcookie('miCookie','',time()-3600);
    
session_destroy();
//volvemos a la pagina donde se pide usr/pwd
    
header("Location: acceso.php");
    exit();
}

?>
Archivo para salir de la zona restringida y cerrar la sesión
salir.php

Código PHP:
<?
session_name
('misitio');
session_start();
//destruimos la sesión
session_unset();
//limpiamos el array de $_SESSION de posibles valores residuales
$_SESSION = array();

//destruimos la posible cookie
setcookie('miCookie','',time()-3600);

session_destroy();
header ("Location: index.php");
?>
  #6 (permalink)  
Antiguo 15/06/2006, 06:25
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
Cita:
Así mismo, he activado y desactivado el
session.use_trans_sid y, el funcionamiento parece el mismo.
Como creo que en este mismo mensaje te he comentado .. PHP puede propagar el SID en el URL automáticamente re-escribiendo ciertos tag's HTML (links, formularios y poco más) o por cookies.

Si siempre es posible crear la cookie y usa session.use_cookies a ON .. da igual si cambias el valor de session.use_trans_sid pues siempre propagarás el SID en cookies .. pongas tu a mano el SID en tus links y redireccionamientos en general o dejes que PHP lo haga por tí (en ciertos casos y ciertos tag's HTML por qué por ejemplo PHP no lo hace en un header("Location ...") ni tampoco en redireccionamientos usando javascript y otras cosas más).

Para tus pruebas .. deberías combinar las directivas de configuración de pHP para "forzar" el uso de la propagación del SID enteramente por cookies o por el URL:

Para forzar propagación del SID en cookies:
session.use_trans_sid = OFF
session.use_cookies = ON
session.use_only_cookies = ON

Para forzar sólo propagación del SID en el URL:
session.use_trans_sid = ON
session.use_cookies = OFF
session.use_only_cookies = OFF

Y recuerda en este caso que PHP no va a insertar el SID en casos como los que comenté .. ahí es necesario hacerlo a mano como tu mismo usabas en tus primeros ejemplos (usando la constante SID que devuelve el nombre+Id sesión en curso).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #7 (permalink)  
Antiguo 15/06/2006, 06:28
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
Cita:
Bueno, después de un largo rato probando y probando con las cookies, ya parece que he encontrado una solución que funciona y parece tener sentido. Ruego me digáis si hay alguna incoherencia. Por ejemplo, me gustaría saber si es necesario que el nombre de la cookie sea igual al nombre de la sesión. O también ¿Hay que hacer la llamada a session_name(...) y session_start() en todos los momentos que yo la hago, o sobra alguna llamada? El código para autentificar usuarios es el siguiente (pongo el código completo)
No es necesario que tu generes una cookie para propagar el SID .. PHP ya implementa ese sistema por tí y lo gestiona perfectamente. Sólo debes "activarlo" si no lo usas actualmente. La configuración es la misma que te mencioné en mi mensaje anterior:

session.use_trans_sid = OFF
session.use_cookies = ON
session.use_only_cookies = ON

En el mismo php.ini tienes más directivas que ajustan las propiedades de las cookies que PHP generará en este caso y también puedes ajustarlas por otras funciones de PHP sobre sesiones (session_set_cookie_params() si no me equivoco).

De hecho .. en tu sistema generas una cookie .. OK, guardas un tiempo y lo codificas en MD5() .. Ok (una especie de "SID" propio que haces ahí) .. la cookie le das un tiempo de vida y lo primero que haces en tus validaciones es ver esa cookie si existe o no .. Pero, realmente el SID "va por otro lado" y así está funcionado ahora (propagando el SID). El problema principal que tiene lo que estás haciendo ahora es en cuanto a la duración en sí de los datos en la sesión; sigue mandando el tiempo que define session.gc_maxtimelife (la duración de la sesión físicamente en el servidor) y la duración de la cookie que PHP crea para propagar el SID.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.

Última edición por Cluster; 15/06/2006 a las 06:35
  #8 (permalink)  
Antiguo 15/06/2006, 15:02
 
Fecha de Ingreso: septiembre-2005
Mensajes: 94
Antigüedad: 18 años, 6 meses
Puntos: 0
Gracias, cluster.

Cita:
El problema principal que tiene lo que estás haciendo ahora es en cuanto a la duración en sí de los datos en la sesión; sigue mandando el tiempo que define session.gc_maxtimelife (la duración de la sesión físicamente en el servidor) y la duración de la cookie que PHP crea para propagar el SID.
A qué te refieres con los "datos en la sesión". Si es la variable $_Session a la que te refieres, la elimino ( $_Session=array() ) en cuanto la sesión acaba. Así mismo hago con la cookie creada por mí, la elimino cuando acaba la sesión.

También tengo la pregunta de ¿Supone algún boquete de seguridad que la SID vaya por otro lado, es decir, que lo haga yo con mi cookie personalizada?
  #9 (permalink)  
Antiguo 16/06/2006, 06:46
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
Cita:
A qué te refieres con los "datos en la sesión". Si es la variable $_Session a la que te refieres, la elimino ( $_Session=array() ) en cuanto la sesión acaba. Así mismo hago con la cookie creada por mí, la elimino cuando acaba la sesión.
Si tuvieras definido un valor de session.gc_maxtimelife menor a la duración de tu cookie .. la sesión expiraría antes de lo que tu con tu cookie controlas .. Por eso insisto que es PHP tal cual gestionas tu "tiempo de expiración" quien controla ese tema en última instancia .. Por supuesto si tu tienes un valor de gc_maxtimelife alto (24 minutos viene por defeco dicha directiva) y tu "juegas" con tu cookie en tiempos inferiores .. tu cookie funcionará y actuará de forma correcta pero no al contrario.

Cita:
También tengo la pregunta de ¿Supone algún boquete de seguridad que la SID vaya por otro lado, es decir, que lo haga yo con mi cookie personalizada?
Es que realmente tu no propagas el SID que usa PHP .. tu creas tu própio "identificador" para tu cookie .. pero insisto que PHP por otro lado está creando otra cookie con su própio SID.

Si quieres gestionar realmente el SID tu mismo con tus métodos .. deberías revisar:

Session_id() (para usar tu própio ID de sesión ..)
http://www.php.net/manual/en/function.session-id.php

Y si quieres controlar el uso de sesiones con tus própias funciones y métodos:
http://www.php.net/manual/en/functio...ve-handler.php

Hay una classe por ahí .. ADOdb que gestiona sesiones de forma própia, sustituyendo parte de lo que PHP hace por defecto. Almacena datos de las sesiones en BBDD y aporta muchas funcionalidades al uso de sesiones: tiempos de vida de sesiones en forma individual, posibilidad de "matar" selectivamente una u otra sesión (desde un "panel de administración" que hagas) .. posibilidad de ver las sesiones en curso (todas ...) en fin .. un control mucho más "fino" de lo que el sistema nativo de sesiones de PHP aporta por defecto. Por si quieres verla:

http://phplens.com/lens/adodb/docs-session.htm

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 05:19.