Control de sesiones en PHP

Para controlar las sesiones en PHP usaremos la función session_start();. Esta función simplemente nos va a crear para sesión en curso el vector $_SESSION, donde podremos guardar distintos datos para la sesión en curso. Lógicamente las sesiones también se pueden finalizar usando las siguientes funciones: session_unset() y session_destroy(). Con la primera desactivamos en vector $_SESSION pero es con la segunda con la que realmente cerramos la sesión.
En cuanto a session_start ()
session_start () Inicia o continua una sesión para el usuario activo. Al hacer session_start() PHP de forma interna recibe un identificador de sesión almacenado en la cookie o el que se envíe a través de la URL. Si no existe tal identificador se sesión, simplemente lo crea.
Al vector $_SESSION le podemos crear nuevos campos según sea necesario, por ejemplo:

Ejemplo de control de sesión en PHP

<?php
session_start();
$_SESSION['usuario']="user";
$_SESSION['tiempo']=time();
echo $_SESSION['usuario'];
echo $_SESSION['tiempo'];
session_unset();
session_destroy();
echo $_SESSION['usuario'];  //Darán error ya que ha sido eliminado el vector $_SESSION
echo $_SESSION['tiempo'];
?>

Esquema básico de autentificación en PHP

Normalmente cuando autentificamos en PHP lo que pretendemos es controlar que usuarios acceden y que usuarios no acceden a una aplicación, Para eso se siguen estos pasos.

  1. Petición de nombre de usuario y contraseña
  2. Comprobación de los anteriores datos
  3. En caso correcto establecemos la sesión
  4. En caso incorrecto se vuelve a solicitar usuario y contraseña

Un ejemplo básico podría ser
Para hacer este ejemplo usaremos 4 ficheros php:

  1. index.php, se supone el inicio de la aplicación, pero sólo será visible si el usuario esta validado
  2. validar.php, aqui se piden los datos de conexión y se compueban, en caso correcto establecemos la sesión y vamos a la aplicación (index.php), en caso contrario volvemos a validar.php
  3. cerrar.php, en este fichero cerramos la sesión
  4. Seguridad, fichero que incluimos en todos los demás para comprobar siempre que el usuario este logado

validar.php

<!DOCTYPE html>
<html lang="es">
<head>
<title>Validando usuarios en PHP</title>
<meta charset="UTF-8">
<meta name="description" content="Proceso para validad formularios en PHP"/>
<meta name="keywords" content="validar usuarios,php"/>
<meta name="author" content="Juan Luis Mora Blanco" />
</head>
<body>
<?php
if (isset($_POST['nombre']) && isset($_POST['clave']))
	{
	if (($_POST['nombre']=="usuario")&&($_POST['clave']=="123456") )
		{
		session_start();
		$_SESSION['usuario']="usuario";
		$_SESSION['tiempo']=time();
		header("location:index.php");
		}
	else
		header("location:index.php");

	}
else
	{
	?>
	<h1>Control de sesiones</h1>
	<table align="center">
	<form action="validar.php" method="POST"/>
	<tr>
	<td>Nombre:</td>
	<td><input type="text" name="nombre"/></td>
	</tr>
	<tr>
	<td>Clave:</td>
	<td><input type="password" name="clave"/></td>
	</tr>
	<tr>
	<td></td>
	<td><input type="submit" value="Acceder"/></td>
	</tr>
	</form>
	<?php
	}
?>
</body>
</html>

seguridad.php

<?php
session_start();
if (!isset($_SESSION['usuario']))
	header("location:validar.php");
?>

index.php

<head>
<title>Validando usuarios en PHP</title>
<meta charset="UTF-8">
<meta name="description" content="Proceso para validad formularios en PHP"/>
<meta name="keywords" content="validar usuarios,php"/>
<meta name="author" content="Juan Luis Mora Blanco" />
</head>
<body>
<?php
include ("seguridad.php");
?>
<h1>Control de sesiones</h1>
<p>Se ha autetificado usted como: <?php echo $_SESSION['usuario'];?> a la hora UNX: <?php echo $_SESSION['usuario'];?> con éxito<p>
<p>Puede cerrar su sesión aquí: <a href="cerrar.php?cerrar">Cerrar sesión</a></p>
</body>
</html>

cerrar.php

<head>
<title>Validando usuarios en PHP</title>
<meta charset="UTF-8">
<meta name="description" content="Proceso para validad formularios en PHP"/>
<meta name="keywords" content="validar usuarios,php"/>
<meta name="author" content="Juan Luis Mora Blanco" />
</head>
<body>
<?php
include ("seguridad.php");
session_unset();
session_destroy();
?>
<h1>Control de sesiones</h1>
<p>Sesion cerrada</p>
<p><a href="index.php">Volver al inicio</a></p>
</body>
</html>

Ejercicios

  1. Haz lo mismo para dos usuarios distintos, es decir dos nombres de usuarios
  2. ¿Como lo haría teniendo los nombres de usuarios y claves en una base de datos?

Originally posted 2011-03-24 21:18:59.

22 Responses to “ Control de sesiones en PHP ”

  1. luis villegas dice:

    Bueno mi pregunta es como la conecto a una base de datos con mmysql o phpadmin

  2. rosy dice:

    hola necesito manejar previlegios en un pagina web para administrador y usuario ??

  3. Pedrog dice:

    Hola, tengo un pequeño gran problema con las sesiones. Las uso como pone el ejemplo para validar el usuario y la contraseña y he creado otro archivo para cerrar la sesion, pero a pesar de cerrar dicha sesion, si le das al botón del navedar “atrás” vuelve a la página. ¿Cómo podría solucionar esto? La estructura es más o menos así:
    index.php (form user/login) –> comprueba.php donde se valida el nombre de usuario y contraseña con unos condicionales “if()” si se cumple la condición te redirecciona a panel.php que a su vez tiene includes con un switch()case para incluir las diferentes páginas. Todas funcionan más o menos bien (aunque no estoy seguro) pero el comprueba.php no… como podría hacerlo de otra forma.
    Muchas gracias

  4. jlmora dice:

    Has incluido el fichero seguridad.php en todo lo que tiene que estar protegido por contraseña ?

    Prueba con un navegador distinto a entrar en alguna página protegida, si te deja sin iniciar sesión será que no la generas bien, si no te deja por la clave, entra y luego sal.
    Ahora prueba a entrar, si entra sin implica que no cierras bien la sesión.

  5. Pedrog dice:

    Hola, muchas gracias por tu respuesta. Yo tengo la seguridad en cada fichero php así:


    Y si no se cumple entonces:

    else {
    header('Location:index.php');
    }
    No se que estoy haciendo mal, pero cuando caduca la sesion, al pasar el tiempo, si que funciona, no dejándo "ir atrás" en el navegador.

  6. Pedrog dice:

    Hola, muchas gracias por tu respuesta. Yo tengo la seguridad en cada fichero php así:

    Y si no se cumple entonces:

    else {
    header('Location:index.php');
    }
    No se que estoy haciendo mal, pero cuando caduca la sesion, al pasar el tiempo, si que funciona, no dejándo "ir atrás" en el navegador.

  7. Pedrog dice:

    Hola, muchas gracias por tu respuesta. Yo tengo la seguridad en cada fichero php así:

    session_name(‘sesion’);
    session_start(‘sesion’);

    if(isset($_SESSION[‘usuario’]) and $_SESSION[‘estado’] == ‘Autentificado’)
    {
    // Lo dejas entrar a la pagina
    //Header (‘Location: cerrar_sesion.php’);

  8. Pedrog dice:

    Hola, muchas gracias por tu respuesta. Yo tengo la seguridad en cada fichero php así:

    session_name(‘sesion’);
    session_start(‘sesion’);

    if(isset($_SESSION[‘usuario’]) and $_SESSION[‘estado’] == ‘Autentificado’)
    {
    // Lo dejas entrar a la pagina
    //Header (‘Location: cerrar_sesion.php’);

    <?php
    session_name('sesion');
    session_start('sesion');

    if(isset($_SESSION['usuario']) and $_SESSION['estado'] == 'Autentificado')
    {
    // Lo dejas entrar a la pagina
    //Header ('Location: cerrar_sesion.php');

    Perdón por los duplicados, es que no salía la primera parte (debido a la etiqueta <?php)

  9. Pedrog dice:

    Muchas gracias. Entonces según tu, si cierro la sesión, no debería poder regresar a la página anterior pulsando el botón de atras del navegador?
    Yo pienso lo mismo, porque si no sería una falta total de seguridad y sería muy poco útil la sesion.
    Si me lo confirmas, doy por cerradas todas mis dudas y como me dijiste en tu anterior respuesta, me centraré en ver que tengo mal.

  10. rosy dice:

    hola necesito que mi pagina maneje sesiones para darle privilegios al usuario y al administrador ojala puedas ayudarme te lo agradeceria mucho.

    buen dia

  11. Agus dice:

    JLmora has sido muy claro en tus explicaciones. Gracias!!!

  12. Alex dice:

    Una consulta.. Hay alguna forma de validar la sesión cuando hacen atrás en las flechas de navegación??

  13. Are dice:

    Hola una consulta yo requiero que en mi web, cada usuario establezca una sola sesion a la vez como podria lograr esto? Me explico mejor un usuraio al tener una sesion abierta no puede iniciar otra sesion en otro PC u otro navegador

  14. esteban dice:

    gracias me esta siendo muy tu explicacion para un proyecto que estoy realizando pero necesito conectarlo con mysql la session star como hago donde debo cambiar los datos

    gracias espero una ayuda

  15. Janner dice:

    Hola tu tutorial me parece bueno, pero si le agregaras algun Hash como el Sha512 y una salt seria perfecto.

    Si lo haces seria bueno crear la tabla sql y el archivo registrar.php para que las contrasenas esten encriptadas antes de hacer el inicio de sesion.

    Felicidades.

  16. nestor dice:

    señor como redirecciono usuarios a paginas diferentes usando switch; un usuario debe ir a una pagina index1.php y el otro a index2.php,la conexion a la base de datos ya se como hacerlo my problemas es este

  17. jose dice:

    Hola, mi pregunta es porque despues de cerrar sesion si pulso el boton atras del navegador me vuelve a la pagina donde estaba antes.

  18. Antonio dice:

    Exelente codigo, funcional 100%

  19. rulo dice:

    buen tutorial me funciono para mis sesiones pero lo adapte un poco le quite el password ya que solo necesito restringir una paginas a la persona qie no esta logueada

  20. jhoan muercia dice:

    Hola, será que se puede lo cual necesito poder poner mas contraseña en la sesión if (($_POST[‘cc’]==”contraseña” )) porque tengo un java script que si lo hace pero no consigue tener protección de haber cerrado sesión.

Deja un comentario