Diferencia entre revisiones de «Usuario:ManuelRomero/php/sesiones/concepto»

De WikiEducator
Saltar a: navegación, buscar
(Página creada con «{{:Usuario:ManuelRomero/php/sesiones/nav}} ===Qué es una Cookie=== *Una cookie es una pequeña cantidad de datos almacenada por el navegador del usuario cuando solicita un...»)
 
(Creando la sesión)
 
(5 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
 
{{:Usuario:ManuelRomero/php/sesiones/nav}}
 
{{:Usuario:ManuelRomero/php/sesiones/nav}}
===Qué es una Cookie===
+
<!--__NOEDITSECTION__-->
*Una cookie es una pequeña cantidad de datos almacenada por el navegador del usuario cuando solicita una página a un servidor.
+
__NOTOC__
*Con esto podemos suplir la característica de que http es un protocolo sin estado (Insistir en que esto es una característica del protocolo, no una limitación.
+
*Una Cookie es un fichero que se '''''almacene en el cliente''''' y guarda información de ese cliente en referencia a una determinada sitio web.
+
*Como se guardan en el cliente, se necesita confirmación expresa del cliente para dejar que se almacenen cosas en su equipo
+
*En general no se debe de abusar de ellas, máxime cuando muchos las pueden tener deshabilitadas y esto puede impedir que nuestra aplicación web se ejecute de forma eficiente o incluso correcta.
+
*El servidor es quien solicita la creación del coockie en el cliente
+
*El cliente crea  un fichero con dicha información
+
*Una vez creada, solo puede ser leída por el sitio web que la creó.
+
*Para trabajar con cookies tenemos que hacer dos cosas
+
*El tamaño máximo de un cookie está limitado a 4K.
+
#Alamacenar o crear la cookie
+
#Poder leerla en un momento determinado
+
====Crear una coockie====
+
*Para ello usaremos la fucnión '''''setCookie(...)'''''
+
*En esta función puede recibir hasta 7 parámetros,  (sólo el primero es obligatorio).
+
http://es.php.net/manual/es/function.setcookie.php
+
*Es habitual usar los tres primeros que serían
+
#Nombre de la cookie
+
#Valor que almacenamos en ella
+
#Tiempo de expiración: es un entero en segundos. Si no se especifica, la cookie termiará junto a esta sesión.
+
*Por ejemplo si quieremos almacenar  el usuario y que tenga un tiempo de duración de 1 hora
+
<source lang=php>
+
  setcookie("usuario", $_SERVER['PHP_AUTH_USER'], time()+3600);
+
</source>
+
*Importante el envío de cookies al cliente ha de hacerse antes de que se escriba nada en html, igual que las funciones header.
+
====Recuperar la cookie====
+
*El proceso de recuperación de la información que almacena una cookie es muy simple.
+
*Cuando accedes a un sitio web, el navegador (cliente),  le envía de forma automática todo el contenido de las cookies que almacene relativas a ese sitio en concreto (servidor).
+
*Desde PHP se puede  acceder a esta información por medio del array $_COOKIE.
+
*Para recuperar los datos anteriores
+
<source lang=php>
+
$usuario = $_COOKIE['usuario'];
+
</source>
+
====Borrar una cookie====
+
*Para borrar la cookie usamos la función setcookie con un tiempo negativo
+
<source lang="php">
+
<?php
+
// Ponemos un tiempo de expiración negativo
+
setcookie("user", "", time()-3600);
+
?>
+
</source>
+
{{Actividad|
+
*En la página  registro.php anterior, almacena en una cookie el último instante en que el cualquier usuario visitó la página.
+
*Si es su primera visita, muestra un mensaje de bienvenida.
+
* En caso contrario, muestra la fecha y hora de su anterior visita.
+
* Deberás utilizar la función setcookie para guardar el instante de su anterior visita y mostrar su contenido utilizando el array $_COOKIE.
+
  
==Posible solucion==
 
*Tomado el ejemplo anterior (de autentificación), habría que añadir el siguiente código
 
<source lang=php>
 
  
if($resultado->num_rows == 0) {
 
//......
 
  
 +
{{Conocimiento previo|Title=¿Qué son las sesiones?|
 +
* Es otro método para hacer que variables estén disponibles en múltiples páginas
 +
* A diferencia de las cookies, las variables de sesión se almacenan en el servidor
 +
* Tienen un tiempo limitado de existencia.
 +
* Para identificar al usuario que generó las variables de sesión, el servidor genera una clave única que es enviada al navegador y almacenada en una cookie.
 +
* Luego, cada vez que el navegador solicita otra página al mismo sitio, envía esta cookie (clave única) con la cual el servidor identifica de qué navegador proviene la petición y puede rescatar de un archivo de texto las variables de sesión que se han creado.
 +
* Cuando han pasado 20 minutos sin peticiones por parte de un cliente (navegador) las variables de sesión son eliminadas automáticamente (se puede configurar el entorno de PHP para variar este tiempo).
 +
* Una variable de sesión es más segura que una cookie ya que se almacena en el servidor.
 +
* No tiene que estar enviándose continuamente como sucede con las cookies.
 +
* Cuando el navegador del cliente está configurado para desactivar las cookies las variables de sesión, tienen forma de funcionar (enviando la clave como parámetro en cada hipervínculo).
 +
* Desventaja: ocupa espacio en el servidor.
 +
}}
 +
===SSID de la sesión===
 +
*Existen dos maneras de mantener el SSID de la sesión
 +
#Utilizando cookies, tema ya visto.
 +
#Propagando el SID en un parámetro de la URL. El SID se añade como una parte más de la URL, de la forma:
 +
  http://www.misitioweb.com/tienda/listado.php&PHPSESSID=34534fg4ffg34ty
 +
*En el ejemplo anterior, el SID es el valor del parámetro PHPSESSID.
 +
*En php todas estas acciones se realizan de forma transparente para el programador, es decir, como desarrolladores podemos directamente utilizar las sesiones en php sin necesidad de tener que transmitir el SSID. Directemnte php nos ofrece supervariables y funciones para gestionarlo.
 +
===Configuración===
 +
*Existen una serie de directivas para configurar las sesiones, que conviene conocer
 +
*Estas se pueden consultar viendo phpinfo(), y modificar en el fichero de configuración de  php, '''''php.ini'''''
 +
*Para ver todas las directivas http://es.php.net/manual/es/session.configuration.php
 +
;session.use_cookies
 +
:Indica si se deben usar cookies (1) o propagación en la URL (0) para almacenar el SID.
 +
:session.use_only_cookies
 +
:Se debe activar (1) cuando utilizas cookies para almacenar los SID, y además no quieres que se reconozcan los SID que se puedan pasar como parte de la URL (este método se puede usar para usurpar el identificador de otro usuario).
 +
;session.save_handler
 +
:Se utiliza para indicar a PHP cómo debe almacenar los datos de la sesión del usuario. Existen cuatro opciones: en ficheros (files), en memoria (mm), en una base de datos SQLite (sqlite) o utilizando para ello funciones que debe definir el programador (user). El valor por defecto (files) funcionará sin problemas en la mayoría de los casos.
 +
;session.name
 +
:Determina el nombre de la cookie que se utilizará para guardar el SID. Su valor por defecto es PHPSESSID.
 +
;session.auto_start
 +
:Su valor por defecto es 0, y en este caso deberás usar la función session_start para gestionar el inicio de las sesiones. Si usas sesiones en el sitio web, puede ser buena idea cambiar su valor a 1 para que PHP active de forma automática el manejo de sesiones.
 +
;session.cookie_lifetime
 +
:Si utilizas la URL para propagar el SID, éste se perderá cuando cierres tu navegador. Sin embargo, si utilizas cookies, el SID se mantendrá mientras no se destruya la cookie. En su valor por defecto (0), las cookies se destruyen cuando se cierra el navegador. Si quieres que se mantenga el SID durante más tiempo, debes indicar en esta directiva ese tiempo en segundos.
 +
;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.
 +
{{Actividad| Localiza y actualiza estas directivas en tu fichero de configuración
 +
*coméntalas con tus palabras en dicho fichero}}
  
else {
+
===Creando la sesión===
    if (isset($_COOKIE['ultimo_login'])) {
+
*En función de como esté configurado la directiva '''''session.auto_start'''''
        $ultimo_login = $_COOKIE['ultimo_login'];
+
*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();
    setcookie("ultimo_login", time(), time()+3600);
+
{{Actividad|Haz un programa que te cuente cuantas visitas recibe la página
}
+
=Posible solución=
 
+
<hr/><!--__NOEDITSECTION__-->
//..... y una vez dentro de la página
+
__NOTOC__
 
+
{|cellpadding="5" cellspacing="6" style="width:100%;background:#DFFFFF; border-style:solid; border-width:2px; border-color:#0066FF;"
if (isset($ultimo_login))
+
| width="100%" valign="top" style="padding: 0; margin:0px;" |
    echo "Ultimo login: " . date("d/m/y \a \l\a\s H:i", $ultimo_login);
+
{|cellpadding="5" cellspacing="6" style="width:100%;background:#DFFFFF; border-style:solid; border-width:1px; border-color:#0066FF;"  
else
+
| width="100%" valign="top" style="padding: 0; margin:0px;" |
    echo "Bienvenido. Esta es su primera visita."
+
<span style="background:#FFFF99">
 
+
</span>
 +
[[Imagen:DWES_TituloTema5.png|center]]
 +
|}
  
  
 +
{{Conocimiento previo|Title=¿Qué son las sesiones?|
 +
* Es otro método para hacer que variables estén disponibles en múltiples páginas
 +
* A diferencia de las cookies, las variables de sesión se almacenan en el servidor
 +
* Tienen un tiempo limitado de existencia.
 +
* Para identificar al usuario que generó las variables de sesión, el servidor genera una clave única que es enviada al navegador y almacenada en una cookie.
 +
* Luego, cada vez que el navegador solicita otra página al mismo sitio, envía esta cookie (clave única) con la cual el servidor identifica de qué navegador proviene la petición y puede rescatar de un archivo de texto las variables de sesión que se han creado.
 +
* Cuando han pasado 20 minutos sin peticiones por parte de un cliente (navegador) las variables de sesión son eliminadas automáticamente (se puede configurar el entorno de PHP para variar este tiempo).
 +
* Una variable de sesión es más segura que una cookie ya que se almacena en el servidor.
 +
* No tiene que estar enviándose continuamente como sucede con las cookies.
 +
* Cuando el navegador del cliente está configurado para desactivar las cookies las variables de sesión, tienen forma de funcionar (enviando la clave como parámetro en cada hipervínculo).
 +
* Desventaja: ocupa espacio en el servidor.
 +
}}
 +
===SSID de la sesión===
 +
*Existen dos maneras de mantener el SSID de la sesión
 +
#Utilizando cookies, tema ya visto.
 +
#Propagando el SID en un parámetro de la URL. El SID se añade como una parte más de la URL, de la forma:
 +
  http://www.misitioweb.com/tienda/listado.php&PHPSESSID=34534fg4ffg34ty
 +
*En el ejemplo anterior, el SID es el valor del parámetro PHPSESSID.
 +
*En php todas estas acciones se realizan de forma transparente para el programador, es decir, como desarrolladores podemos directamente utilizar las sesiones en php sin necesidad de tener que transmitir el SSID. Directemnte php nos ofrece supervariables y funciones para gestionarlo.
 +
===Configuración===
 +
*Existen una serie de directivas para configurar las sesiones, que conviene conocer
 +
*Estas se pueden consultar viendo phpinfo(), y modificar en el fichero de configuración de  php, '''''php.ini'''''
 +
*Para ver todas las directivas http://es.php.net/manual/es/session.configuration.php
 +
;session.use_cookies
 +
:Indica si se deben usar cookies (1) o propagación en la URL (0) para almacenar el SID.
 +
:session.use_only_cookies
 +
:Se debe activar (1) cuando utilizas cookies para almacenar los SID, y además no quieres que se reconozcan los SID que se puedan pasar como parte de la URL (este método se puede usar para usurpar el identificador de otro usuario).
 +
;session.save_handler
 +
:Se utiliza para indicar a PHP cómo debe almacenar los datos de la sesión del usuario. Existen cuatro opciones: en ficheros (files), en memoria (mm), en una base de datos SQLite (sqlite) o utilizando para ello funciones que debe definir el programador (user). El valor por defecto (files) funcionará sin problemas en la mayoría de los casos.
 +
;session.name
 +
:Determina el nombre de la cookie que se utilizará para guardar el SID. Su valor por defecto es PHPSESSID.
 +
;session.auto_start
 +
:Su valor por defecto es 0, y en este caso deberás usar la función session_start para gestionar el inicio de las sesiones. Si usas sesiones en el sitio web, puede ser buena idea cambiar su valor a 1 para que PHP active de forma automática el manejo de sesiones.
 +
;session.cookie_lifetime
 +
:Si utilizas la URL para propagar el SID, éste se perderá cuando cierres tu navegador. Sin embargo, si utilizas cookies, el SID se mantendrá mientras no se destruya la cookie. En su valor por defecto (0), las cookies se destruyen cuando se cierra el navegador. Si quieres que se mantenga el SID durante más tiempo, debes indicar en esta directiva ese tiempo en segundos.
 +
;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.
 +
===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|
 +
<source lang="php">
 +
<? session_start();
 +
if (!isset($_SESSION["cuenta_paginas"])){
 +
    $_SESSION["cuenta_paginas"] = 1;
 +
}else{
 +
    $_SESSION["cuenta_paginas"]++;
 +
}
 +
?>
 +
<html>
 +
<head>
 +
<title>Contar páginas vistas por un usuario en toda su sesión</title>
 +
</head>
  
 +
<body>
 +
<?
 +
echo "Desde que entraste has visto " . $_SESSION["cuenta_paginas"] . " páginas";
 +
?>
 +
<br>
 +
<br>
 +
<a href="otracuenta.php">Ver otra página</a>
 +
</body>
 +
</html>
 
</source>
 
</source>
 +
}}
  
 +
{{Tip| Cuando se hace un cambio de estado (login, cambio de permisos, ...): regenerar id.
 +
  session_regenerate_id()
 
}}
 
}}
{{Resumen|
+
*Una vez creada la sesión podemos almacenar/consultar información de la misma consultando la variable superglobal $_SESSION
==Creación de coockies==
+
{{Ejemplo
<source lang="php">
+
<source lang=php>
 
<?php
 
<?php
$expire = time()*60*60*24*30 //La coockie durará un  mes
+
// Iniciamos la sesión o recuperamos la anterior sesión existente
setcookie("user", "Alex Porter", $expire);
+
session_start();
?>
+
// Comprobamos si la variable ya existe
 +
if (isset($_SESSION['visitas']))
 +
$_SESSION['visitas']++;
 +
else
 +
$_SESSION['visitas'] = 0;
 +
?>
 
</source>
 
</source>
*Si tiempo de  expiración es 0, la coockie que solo dura la sesion
+
}}
<source lang="php">
+
*Ahora almacenemos el instante en el que se produce cada visita
 +
<source lang=php>
 
<?php
 
<?php
$expire = =; //La coockie durará lo que dure la sesión
+
// Iniciamos la sesión o recuperamos la anterior sesión existente
setcookie("user", "Alex Porter", $expire);
+
session_start();
?>
+
// En cada visita añadimos un valor al array "visitas"
 +
$_SESSION['visitas'][] = mktime();
 +
?>
 
</source>
 
</source>
== Ver el valor de una cookie ==
 
<source lang="php">
 
<?php
 
// Ver una cookie concreta
 
echo $_COOKIE["user"];
 
  
// Para ver todas las cookies
+
===Eliminando la sesion===
print_r($_COOKIE);
+
*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
</source>
+
;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.
  
== Borrado ==
+
 
<source lang="php">
+
==Propuesta de solución==
 +
<source lang=php>
 
<?php
 
<?php
// Ponemos un tiempo negativo
+
// Si el usuario aún no se ha autentificado, pedimos las credenciales
setcookie("user", "", time()-3600);
+
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>
 
</source>
 +
 
}}
 
}}
  
{{Actividades|
+
{{Lectura|Title=Documentación|
*Crea una pagina que simule ser la de un periódico. La misma debe permitir configurar que tipo de titular deseamos que aparezca al visitarla, pudiendo ser:
+
* http://www.php.net/manual/es/book.session.php
#Noticia política.
+
* http://www.w3schools.com/php/php_sessions.asp
#Noticia económica.
+
* http://www.mclibre.org/consultar/php/lecciones/php_sesiones.html
#Noticia deportiva.
+
*Mediante tres objetos de tipo radio, permitir seleccionar que titular debe mostrar el periódico.  
+
*Almacenar en una cookie el tipo de titutar que desea ver el cliente.
+
*La primera vez que visita el sitio deben aparecer los tres titulares.
+
 
}}
 
}}
 +
 +
 
{{Actividad|
 
{{Actividad|
*Realiza el ejercicio de la siguiente referencia
+
Ejercicios:
*http://www.mclibre.org/consultar/php/ejercicios/cookies/cookies.html}}
+
* http://www.mclibre.org/consultar/php/ejercicios/nivel_medio/sesiones/sesiones.html
 +
** Formulario en tres pasos
 +
** Almacenamiento de datos en sesión
 +
* http://www.mclibre.org/consultar/php/ejercicios/nivel_medio/registro_de_usuarios_1.html
 +
 
 +
}}
 +
 
 +
<source lang="php">
 +
<? session_start();
 +
if (!isset($_SESSION["cuenta_paginas"])){
 +
    $_SESSION["cuenta_paginas"] = 1;
 +
}else{
 +
    $_SESSION["cuenta_paginas"]++;
 +
}
 +
?>
 +
<html>
 +
<head>
 +
<title>Contar páginas vistas por un usuario en toda su sesión</title>
 +
</head>
 +
 
 +
<body>
 +
<?
 +
echo "Desde que entraste has visto " . $_SESSION["cuenta_paginas"] . " páginas";
 +
?>
 +
<br>
 +
<br>
 +
<a href="otracuenta.php">Ver otra página</a>
 +
</body>
 +
</html>
 +
</source>
 +
}}
 +
 
 +
{{Tip| Cuando se hace un cambio de estado (login, cambio de permisos, ...): regenerar id.
 +
  session_regenerate_id()
 
}}
 
}}
{{Lectura|Title=Referencias en la web|
+
*Una vez creada la sesión podemos almacenar/consultar información de la misma consultando la variable superglobal $_SESSION
*http://docs.php.net/manual/es/features.cookies.php
+
{{Ejemplo
*http://docs.php.net/manual/es/function.setcookie.php
+
*http://www.w3schools.com/php/php_cookies.asp
+
*http://www.mclibre.org/consultar/php/lecciones/php_cookies.html
+
Normativa: Directiva 2009/136/CE}}
+
===Coockies con array===
+
*En este caso la cookie en lugar de contener un solo valor va a contener un array
+
*A la hora de leer la cookie se hace igual que hasta ahora
+
*Supongamos que tenemos varias cookies, dependiendo del usuario que se ha conectado
+
*De cada uno de esos usuarios tendríamos los accesos que ha realizado en un array indexado  indicando la hora
+
*Leemos la cookie
+
 
<source lang=php>
 
<source lang=php>
 
<?php
 
<?php
....
+
// Iniciamos la sesión o recuperamos la anterior sesión existente
$usuario = $_POST['usuario']
+
session_start();
......
+
// Comprobamos si la variable ya existe
//Leemos la cookie que es un array de accesos
+
if (isset($_SESSION['visitas']))
$arrayAccesos = $_COOKIE[$usuario];
+
$_SESSION['visitas']++;
.....
+
else
 +
$_SESSION['visitas'] = 0;
 +
?> 
 
</source>
 
</source>
*Guardar la cookie
+
}}
*Esto crea el plateamiento de como guardar la cookie a la hora de qué nombre va a tener esta cookie
+
*Ahora almacenemos el instante en el que se produce cada visita
*Es como que en la misma cookie queremos guardar muchos valores, pero en realidad guardamos uno solo que es el array
+
*Una manera de hacerlo es incorporar a la cookie ya guardada el nuevo índice
+
*Para ello una manera de hacerlo es obtener el valor del indice del nuevo elemento obteniendo el tamaño del vector hasta ahora
+
*Incorporamos en la posición correspondiente el nuevo valor
+
 
<source lang=php>
 
<source lang=php>
....
+
<?php
$usuario = $_POST['usuario']
+
// Iniciamos la sesión o recuperamos la anterior sesión existente
......
+
session_start();
//Leemos la cookie que es un array de accesos
+
// En cada visita añadimos un valor al array "visitas"
$arrayAccesos = $_COOKIE[$usuario];
+
$_SESSION['visitas'][] = mktime();
.....
+
?> 
//Ahora ya puedo obtener el tamaño del vector
+
$indice = count($arrayAccesos);
+
//Con este valor añado la nueva entrada
+
setCookie($usuario.'['.$indice.']',time(),time()+3600
+
.....
+
 
</source>
 
</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|
 
{{Actividad|
*Añade en la base de datos usuarios varios usuarios diferentes
+
*Crea una página similar a la anterior usada en cookies,
*Crea un formulario para que el usuario sepuede registrar
+
*Almacena en la sesión de usuario los instantes de todas sus últimas visitas.
<source lang=html5>
+
*Si es su primera visita, muestra un mensaje de bienvenida.
<div id="login">
+
*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.
            <fieldset >
+
*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.
                <legend>Login</legend>
+
                <form action="." method="POST">
+
                    <label for='nombre' >Nombre:</label>
+
                    <input type="text" name ="nombre">
+
                    <label for='pass'>Password: </label>
+
                    <input type="text" name ="pass">
+
                    <input type="submit" value="Cambiar Usuario" name="registrar"/>
+
                </form>
+
            </fieldset>
+
        </div>
+
</source>
+
*Visualiza los accesos del usuario acutual así como los accesos del resto de usuarios
+
*Aquí podemos ver el ejemplo
+
http://www.manuel.infenlaces.com/cookies/
+
*Para el formulario este sencillo css
+
<source lang=css>
+
#login fieldset {
+
  width: 230px;
+
  padding:10px;
+
  border:1px solid #ccc;
+
  background-color: #eee;
+
}
+
  
#login legend {
 
  font-family : Arial, sans-serif;
 
  font-size: 1.3em;
 
  font-weight:bold;
 
  color:#333;
 
}
 
</source>
 
  
===Posible solución del ejercicio===
+
==Propuesta de solución==
 
<source lang=php>
 
<source lang=php>
 
 
<?php
 
<?php
 
// Si el usuario aún no se ha autentificado, pedimos las credenciales
 
// Si el usuario aún no se ha autentificado, pedimos las credenciales
//Si me he registrado verifico los datos
+
if (!isset($_SERVER['PHP_AUTH_USER'])) {
require_once "baseDatos.php";
+
    header('WWW-Authenticate: Basic realm="Contenido restringido"');
     $usuario = $_POST['nombre'];
+
    header("HTTP/1.0 401 Unauthorized");
     $pass = $_POST['pass'];
+
     exit;
     $conexion = conectar();
+
}
     if ($conexion != null) { //Se ha conectado ok a la bd
+
// Vamos a guardar el usuario en una variable de sesión
        date_default_timezone_set('Europe/Madrid');
+
// si no existe, aún no se ha autentificado
        // Ejecutamos la consulta para comprobar si existe
+
session_start();
        // esa combinación de usuario y contraseña
+
if (!isset($_SESSION['usuario'])) {
         $sql = <<<SQL
+
// Conectamos a la base de datos
                SELECT usuario FROM usuarios
+
     $dwes = new mysqli("localhost", "root", "root", "dwes");
                where usuario = ?
+
     $error = $dwes->connect_errno;
                and
+
// Si se estableció la conexión
                contrasena =?
+
     if ($error == null) {
SQL;
+
// Ejecutamos la consulta para comprobar si existe
 
+
// esa combinación de usuario y contraseña
        $stmt = $conexion->stmt_init();
+
         $sql = "SELECT usuario FROM usuarios
        $stmt->prepare($sql);
+
WHERE usuario='${_SERVER['PHP_AUTH_USER']}' AND
 
+
contrasena=md5('${_SERVER['PHP_AUTH_PW']}')";
        $stmt->bind_param("ss", $usuario, md5($pass));
+
        $stmt->execute();
+
         $resultado = $dwes->query($sql);
         $stmt->store_result();
+
        //$stmt->bind_result($u);
+
 
// Si no existe, se vuelven a pedir las credenciales
 
// Si no existe, se vuelven a pedir las credenciales
        $indice = 0;
+
         if ($resultado->num_rows == 0) {
         if ($stmt->num_rows == 0) {
+
             header('WWW-Authenticate: Basic realm="Contenido restringido"');
             $error = "Usuario no reconocido";
+
            header("HTTP/1.0 401 Unauthorized");
         } else {
+
            exit;
             if (isset($_COOKIE[$usuario])) {
+
         } else
                //Leemos la cookie y obtenemos el índice
+
             $_SESSION['usuario'] = $_SERVER['PHP_AUTH_USER'];
                $acceso = $_COOKIE[$usuario];
+
        $resultado->close();
                $indice = count($acceso);
+
        $dwes->close();
            }
+
    }
            //Añadimos el nuevo acceso en la cookie correspondiente
+
}
            setcookie($usuario . "[" . ($indice) . "]", time(), time() + 3600);
+
// Si ya está autentificado
        }
+
else {
         $stmt->free_result();
+
// Comprobamos si se ha enviado el formulario de limpiar el registro
         $conexion->close();
+
    if (isset($_POST['limpiar']))
 
+
         unset($_SESSION['visita']);
 +
    else
 +
         $_SESSION['visita'][] = time();
 
}
 
}
 
?>
 
?>
<!DOCTYPE html>
+
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
 +
    http://www.w3.org/TR/html4/loose.dtd">
 
<html>
 
<html>
 
     <head>
 
     <head>
 
         <meta http-equiv="content-type" content="text/html; charset=UTF-8">
 
         <meta http-equiv="content-type" content="text/html; charset=UTF-8">
         <title>Ejemplo Cookies en autentificación </title>
+
         <title>Ejemplo Tema 4: Cookies en autentificación HTTP</title><link href="dwes.css" rel="stylesheet" type="text/css">
        <link href="cookie.css" rel="stylesheet" type="text/css">
+
 
     </head>
 
     </head>
 
     <body>
 
     <body>
        <div id="login">
 
            <fieldset >
 
                <legend>Login</legend>
 
                <form action="." method="POST">
 
                    <label for='nombre' >Nombre:</label>
 
                    <input type="text" name ="nombre">
 
                    <label for='pass'>Password: </label>
 
                    <input type="text" name ="pass">
 
                    <input type="submit" value="Cambiar Usuario" name="registrar"/>
 
                </form>
 
            </fieldset>
 
        </div>
 
 
 
         <?php
 
         <?php
 
         if ($error == null) {
 
         if ($error == null) {
             echo"<h2>Lista de accesos del usuario conectado actualmente $usuario</h2><hr/>";
+
             echo "Nombre de usuario: " . $_SERVER['PHP_AUTH_USER'] . "<br />";
             if (isset($acceso)) {
+
             echo "Hash de la contraseña: " . md5($_SERVER['PHP_AUTH_PW']) . "<br />";
                for ($i = 0; $i < $indice; $i++)
+
             if (count($_SESSION['visita']) == 0)
                    echo "-Acceso número $i a las  " . date("d/m/y \a \l\a\s H:i", $acceso[$i]) . "<br/>";
+
                 echo "Bienvenido. Esta es su primera visita.";
             } else
+
             else {
                 echo "Bienvenido. Esta es su primera visita. $nombre<br/>";
+
                 date_default_timezone_set('Europe/Madrid');
             //ahora recorro todos los usuarios";
+
                foreach ($_SESSION['visita'] as $v)
            foreach ($_COOKIE as $user => $accesos) {
+
                    echo date("d/m/y \a \l\a\s H:i", $v) . "<br />";
                 if ($user != $usuario) {
+
                ?>
                    echo "<h2> Usuario $user </h2><br/><hr/>";
+
                <form id='vaciar' action='<?php echo $_SERVER['PHP_SELF']; ?>' method='post'>
                    foreach ($accesos as $numAcceso => $hora) {
+
                     <input type='submit' name='limpiar' value='Limpiar registro'/>
                        echo "Acceso número $numAcceso a las " . date("d/m/y \a \l\a\s H:i", $hora) . "<br/>";
+
                 </form>
                     }
+
                <?php
                 }
+
 
             }
 
             }
 
         } else
 
         } else
Línea 292: Línea 408:
 
</html>
 
</html>
 
</source>
 
</source>
*Bases de datos donde habrá que actualizar las credenciales
 
<source lang =php>
 
<?php
 
  
/*
+
}}
* To change this license header, choose License Headers in Project Properties.
+
* To change this template file, choose Tools | Templates
+
* and open the template in the editor.
+
*/
+
 
+
function conectar(){
+
      $usuarioBD ="manuel_manuel";
+
      $pass ="xv2e6w";
+
      $host = "localhost";
+
      $bd = "manuel_dwes";
+
      $conexion = new mysqli($host,$usuarioBD,$pass,$bd);
+
      //Hacemos una consulta a ver si el usuario existe
+
      if ($conexion->connect_errno){
+
          echo ("Se ha producido un error conectado a la base de datos ".$conexion->connect_error);
+
          return null;
+
      }
+
      return $conexion;
+
}
+
?>
+
</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|
 +
Ejercicios:
 +
* http://www.mclibre.org/consultar/php/ejercicios/nivel_medio/sesiones/sesiones.html
 +
** Formulario en tres pasos
 +
** Almacenamiento de datos en sesión
 +
* http://www.mclibre.org/consultar/php/ejercicios/nivel_medio/registro_de_usuarios_1.html
  
 
+
}}
 
+
{{Lectura|Title=Administrar cookies en diferentes navegadores|}}
+
*'''''Firefox''''' http://support.mozilla.org/es/kb/Borrar%20cookies?esab=a&s=cookies&r=2&as=s
+
*'''''Chrome/Chromium''''': http://support.google.com/chrome/bin/answer.py?hl=es&answer=95647
+
*'''''Internet Explorer''''': http://windows.microsoft.com/es-es/windows7/how-to-manage-cookies-in-internet-explorer-9
+
*'''''Opera''''': http://help.opera.com/Windows/11.50/es-ES/cookies.html
+
*'''''Safari''''': http://support.apple.com/kb/ph5042
+

Última revisión de 01:25 26 feb 2015






Icon preknowledge.gif

¿Qué son las sesiones?

  • Es otro método para hacer que variables estén disponibles en múltiples páginas
  • A diferencia de las cookies, las variables de sesión se almacenan en el servidor
  • Tienen un tiempo limitado de existencia.
  • Para identificar al usuario que generó las variables de sesión, el servidor genera una clave única que es enviada al navegador y almacenada en una cookie.
  • Luego, cada vez que el navegador solicita otra página al mismo sitio, envía esta cookie (clave única) con la cual el servidor identifica de qué navegador proviene la petición y puede rescatar de un archivo de texto las variables de sesión que se han creado.
  • Cuando han pasado 20 minutos sin peticiones por parte de un cliente (navegador) las variables de sesión son eliminadas automáticamente (se puede configurar el entorno de PHP para variar este tiempo).
  • Una variable de sesión es más segura que una cookie ya que se almacena en el servidor.
  • No tiene que estar enviándose continuamente como sucede con las cookies.
  • Cuando el navegador del cliente está configurado para desactivar las cookies las variables de sesión, tienen forma de funcionar (enviando la clave como parámetro en cada hipervínculo).
  • Desventaja: ocupa espacio en el servidor.



SSID de la sesión

  • Existen dos maneras de mantener el SSID de la sesión
  1. Utilizando cookies, tema ya visto.
  2. Propagando el SID en un parámetro de la URL. El SID se añade como una parte más de la URL, de la forma:
 http://www.misitioweb.com/tienda/listado.php&PHPSESSID=34534fg4ffg34ty
  • En el ejemplo anterior, el SID es el valor del parámetro PHPSESSID.
  • En php todas estas acciones se realizan de forma transparente para el programador, es decir, como desarrolladores podemos directamente utilizar las sesiones en php sin necesidad de tener que transmitir el SSID. Directemnte php nos ofrece supervariables y funciones para gestionarlo.

Configuración

  • Existen una serie de directivas para configurar las sesiones, que conviene conocer
  • Estas se pueden consultar viendo phpinfo(), y modificar en el fichero de configuración de php, php.ini
  • Para ver todas las directivas http://es.php.net/manual/es/session.configuration.php
session.use_cookies
Indica si se deben usar cookies (1) o propagación en la URL (0) para almacenar el SID.
session.use_only_cookies
Se debe activar (1) cuando utilizas cookies para almacenar los SID, y además no quieres que se reconozcan los SID que se puedan pasar como parte de la URL (este método se puede usar para usurpar el identificador de otro usuario).
session.save_handler
Se utiliza para indicar a PHP cómo debe almacenar los datos de la sesión del usuario. Existen cuatro opciones: en ficheros (files), en memoria (mm), en una base de datos SQLite (sqlite) o utilizando para ello funciones que debe definir el programador (user). El valor por defecto (files) funcionará sin problemas en la mayoría de los casos.
session.name
Determina el nombre de la cookie que se utilizará para guardar el SID. Su valor por defecto es PHPSESSID.
session.auto_start
Su valor por defecto es 0, y en este caso deberás usar la función session_start para gestionar el inicio de las sesiones. Si usas sesiones en el sitio web, puede ser buena idea cambiar su valor a 1 para que PHP active de forma automática el manejo de sesiones.
session.cookie_lifetime
Si utilizas la URL para propagar el SID, éste se perderá cuando cierres tu navegador. Sin embargo, si utilizas cookies, el SID se mantendrá mientras no se destruya la cookie. En su valor por defecto (0), las cookies se destruyen cuando se cierra el navegador. Si quieres que se mantenga el SID durante más tiempo, debes indicar en esta directiva ese tiempo en segundos.
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.


Icon activity.jpg

Actividad

Localiza y actualiza estas directivas en tu fichero de configuración
  • coméntalas con tus palabras en dicho fichero




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();


Icon activity.jpg

Actividad

{




Icon present.gif
Tip: Cuando se hace un cambio de estado (login, cambio de permisos, ...): regenerar id.
 session_regenerate_id()


  • Una vez creada la sesión podemos almacenar/consultar información de la misma consultando la variable superglobal $_SESSION

{{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;
?>

}}

  • Ahora almacenemos el instante en el que se produce cada visita
<?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

  • 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.


Icon activity.jpg

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

<?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>