Comunidad de diseño web y desarrollo en internet online

Como cerrar correctamente sessiones con logout.php

Citar            
MensajeEscrito el 10 Jul 2014 06:35 pm
Estimados,
Tengo una plataforma de login de usuarios, cada uno de ellos tiene un perfil distinto.
los datos de cada uno los mando a buscar a una base de datos con Mysql.
He logrado con consultas sql poder logearme correctamente y mostrar el perfil correspondiente, PERO...
Tengo problemas para poder restringir el acceso y el cierre de las sessiones.

Tengo 2 archivos:
1.- Seguridad.php (seguridad antes de mostrar template)
2.- Logout.php (cierre de session)

Con seguridad.php pretendia restringir que usuarios ingresen a otros perfiles sin haberse logeado.
y con logout.php matar las sessiones activas.

Cuando se autentifica un usuario creo las sessiones de la siguiente forma:

Código PHP :

$perfil =  $getPerfil['tipo_perfil'];

                session_name($perfil);
                session_start();
                session_regenerate_id();


                $_SESSION["autentificado"] = "SI";
                $_SESSION["usuarioActual"] =  $getUser['id_user'];
                $_SESSION["ultimoAcceso"] = date("Y-n-j H:i:s");




                header ("Location: $perfil");


en logout.php

Código PHP :

session_start();
session_destroy();

header("Location: index.php ");


en seguridad.php

Código PHP :

session_name();
session_start();

if ($_SESSION["autentificado"] != "SI") {

    header("Location: index.php");
    exit();

} else {

    $fechaGuardada = $_SESSION["ultimoAcceso"];
    $ahora = date("Y-n-j H:i:s");
    $tiempo_transcurrido = (strtotime($ahora)-strtotime($fechaGuardada));


    if($tiempo_transcurrido >= 600) {

        session_destroy();

        header("Location: $root");

    }else {
        $_SESSION["ultimoAcceso"] = $ahora;
    }
}


al arrancar la aplicación, ingreso sin problemas a un perfil determinado:
http://localhost/proyecto/perfil_1
Al cerrar la session con logout.php me re direcciona a http://localhost/proyecto/
pero me doy cuenta que agregando manual mente http://localhost/proyecto/perfil_1 en la barra de direcciones la session aún sigue activa.

A que se debe ??

Lo mismo pasa con seguridad.php.
Ingreso sin problemas a un perfil http://localhost/proyecto/perfil_1 pero me di cuenta que cambiando la url manualmente a http://localhost/proyecto/perfil_2 ingreso sin autentificación a otro perfil.

A que se debe ??

Por jozeepp

17 de clabLevel



 

chrome
Citar            
MensajeEscrito el 10 Jul 2014 08:57 pm
como restringues el acceso en cada archivo d perfil??

Por tuadmin

Claber

598 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 10 Jul 2014 09:12 pm

tuadmin escribió:

como restringues el acceso en cada archivo d perfil??


Hago el llamado de seguridad.php al inicio de cada template.

Código PHP :

<?php
require 'seguridadAcceso.php';
?>
<!doctype html>
    <html lang="en">
    <head>
...
..
..

Por jozeepp

17 de clabLevel



 

chrome
Citar            
MensajeEscrito el 11 Jul 2014 12:36 pm
La función session_destroy() puede ser un poco engañosa porque no hace lo que se cree que hace. No "destruye" la sesión abierta con session_start(), simplemente la apaga durante el resto de la ejecución del script actual.

Para efectivamente destruir la sesión del usuario deberías vaciar el array $_SESSION antes de usar session_destroy(). O sea, en el script logout.php debes hacer:

Código PHP :

<?php
session_start();

foreach($_SESSION as $key => $value {
  $_SESSION[$key] = NULL;
}

session_destroy();

header("Location: index.php ");
?>


Esto es así porque session_destroy() no remueve la cookie que se crea/actualiza con cada session_start(), para ello debes anular la cookie manualmente con set_cookie().

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 11 Jul 2014 03:37 pm
también:

Código PHP :

session_start();
session_unset();
session_destroy();

Por elporfirio

Claber

652 de clabLevel

1 tutorial

Genero:Masculino  

FullStack Web Developer

firefox
Citar            
MensajeEscrito el 12 Jul 2014 05:51 pm
Gracias Chicos, recién eh tenido tiempo de revisar sus comentarios.
realizare las pruebas y les comento, Muchisimas Gracias!

Por jozeepp

17 de clabLevel



 

chrome
Citar            
MensajeEscrito el 13 Jul 2014 06:19 pm

DriverOp escribió:

La función session_destroy() puede ser un poco engañosa porque no hace lo que se cree que hace. No "destruye" la sesión abierta con session_start(), simplemente la apaga durante el resto de la ejecución del script actual.

Para efectivamente destruir la sesión del usuario deberías vaciar el array $_SESSION antes de usar session_destroy(). O sea, en el script logout.php debes hacer:

Código PHP :

<?php
session_start();

foreach($_SESSION as $key => $value {
  $_SESSION[$key] = NULL;
}

session_destroy();

header("Location: index.php ");
?>


Esto es así porque session_destroy() no remueve la cookie que se crea/actualiza con cada session_start(), para ello debes anular la cookie manualmente con set_cookie().



Muchas gracias, realice las pruebas y me funciona perfecto, pero tuve que eliminar el session_name() que tenia al momento que se creaba un sessio_start(), por alguna razón no me funcionaba con esto... lo remplace por un $_SESSION["name] y me funciona todo correcto... al cerrar session pruebo ingresando a perfil por barra de navegación y me devuelve a index.php gracias a seguridad.php...
Ahora este ultimo, seguridad.php, aun tiene sus detalles. Cada vez que ingreso a un perfil con usuario y contraseña correspondiente, a través de la barra de navegación tengo acceso a todos los perfiles. y eso no esta bien. Me explico ?
actualmente tengo asi:

autentificacion de usuario:

Código PHP :

$perfil =  $getPerfil['tipo_perfil'];
                $user =  $getUser['id_user'];
                
                session_start();
                $_SESSION["name"] = $user;
                $_SESSION["autentificado"] = "SI";
                $_SESSION["usuarioActual"] =  $getUser['id_user'];
                $_SESSION["ultimoAcceso"] = date("Y-n-j H:i:s");

                header ("Location: $perfil");


logout.php

Código PHP :

session_start();

foreach($_SESSION as $key => $value) {
$_SESSION[$key] = NULL;
}


session_destroy();


header("Location: index.php ");


Seguridad.php

Código PHP :

$root = BASE_URL;

session_start();

if ($_SESSION["autentificado"] != "SI") {

    header("Location: $root");
    exit();

}
else{

    $fechaGuardada = $_SESSION["ultimoAcceso"];
    $ahora = date("Y-n-j H:i:s");
    $tiempo_transcurrido = (strtotime($ahora)-strtotime($fechaGuardada));


    if($tiempo_transcurrido >= 600) {

        session_destroy();

        header("Location: $root");

    }else {
        $_SESSION["ultimoAcceso"] = $ahora;
    }
}


a que se debe que no funciona correctamente la capa de seguridad.? Gracias de antemano

Por jozeepp

17 de clabLevel



 

chrome
Citar            
MensajeEscrito el 13 Jul 2014 09:51 pm
En el código que has puesto, no veo que compares la sesión actual (el usuario logueado) contra el perfil que quiere acceder. De hecho, deberías hacer esto en cada página que solo se puede acceder estando logueado.

Por DriverOp

Claber

2510 de clabLevel



 

chrome
Citar            
MensajeEscrito el 14 Jul 2014 03:13 pm

DriverOp escribió:

En el código que has puesto, no veo que compares la sesión actual (el usuario logueado) contra el perfil que quiere acceder. De hecho, deberías hacer esto en cada página que solo se puede acceder estando logueado.


mmmmm Tienes muchas razón, se me fue ese detalle. Ahora como es que puedo comparar la sesión actual con el cada perfil?
entiendo que cuando se llama a session_start() quedan habilitados todos los datos de la variable global $_SESSION del usuario logueado, que en este caso seria.

$_SESSION["name"] - $_SESSION["autentificado"] - $_SESSION["usuarioActual"] - $_SESSION["ultimoAcceso"]

=S Como obtengo los datos del perfil al cual quiero acceder. ahí me perdí.

Por jozeepp

17 de clabLevel



 

chrome
Citar            
MensajeEscrito el 14 Jul 2014 07:16 pm
Pues leyendo la base de datos, supongo...

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 11 Jun 2019 11:12 pm
Justo hoy me surgió el mismo dilema. :lol: Buscando y buscando por Google me topé con este tema y aunque hayan pasado 5 años, me ha servido igual. ^^ ¡Muchísimas gracias! :wink:

Por bafasudeyi

0 de clabLevel



 

chrome
Citar            
MensajeEscrito el 13 Jun 2019 12:12 pm
Por suerte, hay temas "clásicos"

Saludos
Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.