Diferencia entre revisiones de «Usuario:ManuelRomero/php/sesiones»
De WikiEducator
< Usuario:ManuelRomero | php
(14 revisiones intermedias por el mismo usuario no mostrado) | |||
Línea 1: | Línea 1: | ||
− | |||
− | |||
− | |||
{{:Usuario:ManuelRomero/php/nav}} | {{:Usuario:ManuelRomero/php/nav}} | ||
Línea 53: | Línea 50: | ||
;session.gc_maxlifetime | ;session.gc_maxlifetime | ||
:Indica el tiempo en segundos que se debe mantener activa la sesión, aunque no haya ninguna actividad por parte del usuario. Su valor por defecto es 1440. Es decir, pasados 24 minutos desde la última actividad por parte del usuario, se cierra su sesión automáticamente. | :Indica el tiempo en segundos que se debe mantener activa la sesión, aunque no haya ninguna actividad por parte del usuario. Su valor por defecto es 1440. Es decir, pasados 24 minutos desde la última actividad por parte del usuario, se cierra su sesión automáticamente. | ||
− | + | ===Creando la sesión=== | |
− | + | *En función de como esté configurado la directiva '''''session.auto_start''''' | |
− | + | *Si esta activada, la sesión comienza automáticamente al conectarse a un sitio | |
− | + | *Si no está activada la iniciaremos con la funcion session_start(); | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | * | + | |
− | * | + | |
− | * | + | |
− | + | ||
− | + | ||
{{Ejemplo| | {{Ejemplo| | ||
<source lang="php"> | <source lang="php"> | ||
Línea 95: | Línea 83: | ||
session_regenerate_id() | session_regenerate_id() | ||
}} | }} | ||
+ | *Una vez creada la sesión podemos almacenar/consultar información de la misma consultando la variable superglobal $_SESSION | ||
+ | {{Ejemplo | ||
+ | <source lang=php> | ||
+ | <?php | ||
+ | // Iniciamos la sesión o recuperamos la anterior sesión existente | ||
+ | session_start(); | ||
+ | // Comprobamos si la variable ya existe | ||
+ | if (isset($_SESSION['visitas'])) | ||
+ | $_SESSION['visitas']++; | ||
+ | else | ||
+ | $_SESSION['visitas'] = 0; | ||
+ | ?> | ||
+ | </source> | ||
+ | }} | ||
+ | *Ahora almacenemos el instante en el que se produce cada visita | ||
+ | <source lang=php> | ||
+ | <?php | ||
+ | // Iniciamos la sesión o recuperamos la anterior sesión existente | ||
+ | session_start(); | ||
+ | // En cada visita añadimos un valor al array "visitas" | ||
+ | $_SESSION['visitas'][] = mktime(); | ||
+ | ?> | ||
+ | </source> | ||
+ | |||
+ | ===Eliminando la sesion=== | ||
+ | *se puede configurar para que de forma automática se eliminen los datos de una sesión pasados un determinado tiempo | ||
+ | *También podemos actuar directamente sobre una sesión eliminando información | ||
+ | ;session_unset. | ||
+ | :Elimina las variables almacenadas en la sesión actual, pero no elimina la información de la sesión del dispositivo de almacenamiento usado. | ||
+ | ;session_destroy. | ||
+ | Elimina completamente la información de la sesión del dispositivo de almacenamiento. | ||
+ | {{Actividad| | ||
+ | *Crea una página similar a la anterior usada en cookies, | ||
+ | *Almacena en la sesión de usuario los instantes de todas sus últimas visitas. | ||
+ | *Si es su primera visita, muestra un mensaje de bienvenida. | ||
+ | *En caso contrario, muestra la fecha y hora de todas sus visitas anteriores. Añade un botón a la página que permita borrar el registro de visitas. | ||
+ | *Utiliza también una variable de sesión para comprobar si el usuario se ha autentificado correctamente. De esta forma no hará falta comprobar las credenciales con la base de datos constantemente. | ||
+ | |||
+ | |||
+ | ==Propuesta de solución== | ||
+ | <source lang=php> | ||
+ | <?php | ||
+ | // Si el usuario aún no se ha autentificado, pedimos las credenciales | ||
+ | if (!isset($_SERVER['PHP_AUTH_USER'])) { | ||
+ | header('WWW-Authenticate: Basic realm="Contenido restringido"'); | ||
+ | header("HTTP/1.0 401 Unauthorized"); | ||
+ | exit; | ||
+ | } | ||
+ | // Vamos a guardar el usuario en una variable de sesión | ||
+ | // si no existe, aún no se ha autentificado | ||
+ | session_start(); | ||
+ | if (!isset($_SESSION['usuario'])) { | ||
+ | // Conectamos a la base de datos | ||
+ | $dwes = new mysqli("localhost", "root", "root", "dwes"); | ||
+ | $error = $dwes->connect_errno; | ||
+ | // Si se estableció la conexión | ||
+ | if ($error == null) { | ||
+ | // Ejecutamos la consulta para comprobar si existe | ||
+ | // esa combinación de usuario y contraseña | ||
+ | $sql = "SELECT usuario FROM usuarios | ||
+ | WHERE usuario='${_SERVER['PHP_AUTH_USER']}' AND | ||
+ | contrasena=md5('${_SERVER['PHP_AUTH_PW']}')"; | ||
+ | |||
+ | $resultado = $dwes->query($sql); | ||
+ | // Si no existe, se vuelven a pedir las credenciales | ||
+ | if ($resultado->num_rows == 0) { | ||
+ | header('WWW-Authenticate: Basic realm="Contenido restringido"'); | ||
+ | header("HTTP/1.0 401 Unauthorized"); | ||
+ | exit; | ||
+ | } else | ||
+ | $_SESSION['usuario'] = $_SERVER['PHP_AUTH_USER']; | ||
+ | $resultado->close(); | ||
+ | $dwes->close(); | ||
+ | } | ||
+ | } | ||
+ | // Si ya está autentificado | ||
+ | else { | ||
+ | // Comprobamos si se ha enviado el formulario de limpiar el registro | ||
+ | if (isset($_POST['limpiar'])) | ||
+ | unset($_SESSION['visita']); | ||
+ | else | ||
+ | $_SESSION['visita'][] = time(); | ||
+ | } | ||
+ | ?> | ||
+ | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " | ||
+ | http://www.w3.org/TR/html4/loose.dtd"> | ||
+ | <html> | ||
+ | <head> | ||
+ | <meta http-equiv="content-type" content="text/html; charset=UTF-8"> | ||
+ | <title>Ejemplo Tema 4: Cookies en autentificación HTTP</title><link href="dwes.css" rel="stylesheet" type="text/css"> | ||
+ | </head> | ||
+ | <body> | ||
+ | <?php | ||
+ | if ($error == null) { | ||
+ | echo "Nombre de usuario: " . $_SERVER['PHP_AUTH_USER'] . "<br />"; | ||
+ | echo "Hash de la contraseña: " . md5($_SERVER['PHP_AUTH_PW']) . "<br />"; | ||
+ | if (count($_SESSION['visita']) == 0) | ||
+ | echo "Bienvenido. Esta es su primera visita."; | ||
+ | else { | ||
+ | date_default_timezone_set('Europe/Madrid'); | ||
+ | foreach ($_SESSION['visita'] as $v) | ||
+ | echo date("d/m/y \a \l\a\s H:i", $v) . "<br />"; | ||
+ | ?> | ||
+ | <form id='vaciar' action='<?php echo $_SERVER['PHP_SELF']; ?>' method='post'> | ||
+ | <input type='submit' name='limpiar' value='Limpiar registro'/> | ||
+ | </form> | ||
+ | <?php | ||
+ | } | ||
+ | } else | ||
+ | echo "Se ha producido el error $error.<br />"; | ||
+ | ?> | ||
+ | </body> | ||
+ | </html> | ||
+ | </source> | ||
+ | |||
+ | }} | ||
+ | |||
+ | {{Lectura|Title=Documentación| | ||
+ | * http://www.php.net/manual/es/book.session.php | ||
+ | * http://www.w3schools.com/php/php_sessions.asp | ||
+ | * http://www.mclibre.org/consultar/php/lecciones/php_sesiones.html | ||
+ | }} | ||
+ | |||
{{Actividad| | {{Actividad| |
Última revisión de 19:42 21 nov 2014
SSID de la sesión
http://www.misitioweb.com/tienda/listado.php&PHPSESSID=34534fg4ffg34ty
Configuración
Creando la sesión
Tip: Cuando se hace un cambio de estado (login, cambio de permisos, ...): regenerar id.
session_regenerate_id()
{{Ejemplo <?php // Iniciamos la sesión o recuperamos la anterior sesión existente session_start(); // Comprobamos si la variable ya existe if (isset($_SESSION['visitas'])) $_SESSION['visitas']++; else $_SESSION['visitas'] = 0; ?> }}
<?php // Iniciamos la sesión o recuperamos la anterior sesión existente session_start(); // En cada visita añadimos un valor al array "visitas" $_SESSION['visitas'][] = mktime(); ?> Eliminando la sesion
Elimina completamente la información de la sesión del dispositivo de almacenamiento.
|