Professional Documents
Culture Documents
Facultad: Ingeniería
Autenticación de usuarios y Sesiones en PHP
Escuela: Computación
Asignatura: PERL/PHP
Guia 5 pag.1
I. Objetivos
• Identificar las formas en que se pueden desarrollar aplicaciones web requiriendo autenticación de
usuarios
• Aplicar funciones de sesión para crear páginas protegidas
• Crear variables de sesión para almacenar datos y preferencias de los usuarios
¿Qué es la autenticación?
Autenticación o autentificación es un proceso que permite verificar la identidad digital del remitente de
una comunicación digital.
El ejemplo más común, en donde se aplica autenticación es cuando un usuario intenta conectarse a un
servidor, que puede ser de páginas web, de datos de un sistema de gestión de bases de datos, de correo
electrónico, etc. La idea es asegurarse que el usuario que intenta conectarse compruebe su identidad
confirmando que es quien dice ser
En una aplicación web se puede implementar la autenticación de usuarios de tres formas diferentes:
La forma menos elegante de proteger archivos y carpetas del servidor en una aplicación web es crear un
archivo, denominado htaccess.
Este proceso requiere que se modifique una de las opciones en el servidor web Apache en el archivo
httpd.conf.
Como primer paso debe abrirse el archivo httpd.conf y modificar las opciones que se muestran en la línea
AllowOverride All o AllowOverride None y cambiarla por AllowOverride AuthConfig. Guarde el cambio
y cierre el archivo.
La autenticación básica con PHP se base en el uso de variables de entorno cuyos valores se obtienen del
servidor web.
Para acceder a estos datos se utiliza la matriz asociativa $_SERVER. Esta forma de autenticación requiere
que PHP esté instalado como módulo Apache o como módulo ISAPI en Internet Information Server (IIS).
Guia 5 pag.2
Las variables de entorno que deben verificarse como establecidas son:
$_SERVER['SERVER_SOFTWARE'], $_SERVER['PHP_AUTH_USER'] y
$_SERVER['PHP_AUTH_PW']
Existen muchas estrategias para autenticar usuarios desde un script PHP. Existe la posibilidad de hacer la
autenticación directamente en el código con usuarios y contraseñas estáticas o utilizando un archivo de
contraseñas alojado en el servidor. Sin embargo, la forma más segura es utilizando usuarios y contraseñas
almacenados en una base de datos. Este método exige que se aplique la autenticación a cada página a la
que el usuario tenga acceso para garantizar que está accediendo el mismo usuario.
A continuación se presenta un archivo en donde se realiza comprobación usando las variables de entorno
antes descritas, y donde la clave y usuario se encuentran en el mismo script.
III. Desarrollo
Ejemplo 1
autenticacionbasica.php (validacion local con HTTP)
Ejemplo 2
secret. php (formulario de ingreso de usuario y validación local)
<?php
@$name = $_POST['name'];
@$password = $_POST['password'];
if(empty($name) || empty($password)){
?>
Guia 5 pag.3
<h1>Ingrese sus datos para ingresar</h1>
Esta es una página protegida
<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="POST">
<label for="name">
Usuario:
</label>
<input type="text" name="name"><br>
<label for="pass">
Usuario:
</label>
<input type="password" name="password"><br>
<input type="submit" value="Entrar">
</form>
<?php
}
else if($name == 'user' && $password == 'pass'){
//El usuario y contraseña son correctos
$msgauth = "<h2 style=\"font-family:Impact;font-size:15pt;color:Green;\">";
$msgauth .= "Tus datos son correctos. Tienes acceso a este sitio</h2>";
echo $msgauth;
}
else{
$msgden = "<h2 style=\"font-family:Impact;font-size:15pt;color:Red;\">";
$msgden .= "No tienes acceso a este sitio</h2>";
echo $msgden;
}
?>
Ejemplo 3-a
iniciosesion.php (validación con uso de archivos de usuarios – parte 1)
Guia 5 pag.4
</td>
</tr>
<tr>
<td>
<label for="pass">Contraseña: </label>
</td>
<td>
<input type="password" name="pass" size="25" maxlength="25">
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="Encrypt!">
</td>
</tr>
</table>
</form>
</body>
</html>
Ejemplo 3-b
comprobarusuario.php (validación con uso de archivos de usuarios – parte 2)
<?php
if(isset($_SERVER['PHP_AUTH_USER'])){
$user = $_SERVER['PHP_AUTH_USER'];
$pass = $_SERVER['PHP_AUTH_PW'];
}
else if(isset($_SERVER['HTTP_AUTHORIZATION'])){
if(substr($_SERVER['HTTP_AUTHORIZATION'],0,5) == "Basic"){
$userpass = split(":", base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
$user = $userpass[0];
$pass = $userpass[1];
}
}
$auth = false;
$pwfile = fopen("users.txt", "r");
while(!feof($pwfile)){
$data = split(":", rtrim(fgets($pwfile, 1024)));
if($user == $data[0] && crypt($pass, "pw") == $data[1]){
$auth = true;
break;
}
}
fclose($pwfile);
if(!$auth){
header("WWW-Authenticate: Basic realm=\"PHP 5 Unleashed Protected Area\"");
header("HTTP/1.0 401 Unauthorized");
$msgden = "<h2 style=\"font-family:Impact;font-size:15pt;color:Red;\">";
$msgden .= "No tienes acceso a este sitio</h2>";
echo $msgden;
}
else{
Guia 5 pag.5
echo "<h3>Bienvenido, $user!</h3>";
}
?>
SESIONES
La necesidad de las sesiones surge de la naturaleza del protocolo HTTP, que es un protocolo sin estado, lo
que significa que no dispone de un método incorporado para conservar el estado entre dos transacciones.
Esto es lo que provoca que cuando un usuario solicita una página y luego otra, no exista manera de que el
servidor entienda que ambas solicitudes provienen de un mismo usuario, de modo que todas las variables
de un script son reestablecidas siempre después de una solicitud.
Definición de Sesiones
De forma simple, se puede definir una sesión como el tiempo que un usuario permanece conectado a un
sitio web. De forma más técnica y relacionada con programación del lado del servidor, una sesión es un
bloque de información que almacena todo tipo de variables y valores relacionados con los usuario y sus
visitas a un sitio web en particular. El control de la sesión consiste en poder realizar un siguimiento del
usuario mientras se mantenga navegando por el sitio web, permitiendo mostrar contenido de las páginas
en función de su nivel de autorización o de sus preferencias personales
Implementar Sesiones
La primera es utilizando la función session_start( ), con la cual se puede crear un identificador de sesión
nuevo, o retomar un id de sesión creado previamente. Se requiere que utilice la llamada a esta función al
inicio de todas las secuencias de comando que vayan a utilizar sesiones.
La segunda forma, consiste en configurar el archivo php.ini para que inicie sesiones de forma
automática cuando alguien visite el sitio. Para ello se debe asignar el valor de uno a la variable de
configuración session.auto_start, cuyo valor por defecto es cero. Este método tiene el inconveniente que
no permite utilizar objetos como variables de sesión.
Guia 5 pag.6
Utilice la matriz superglobal $_SESSION para crear una variable de sesión.
Una variable de sesión se crea cuando se coloca como índice de la matriz superglobal $_SESSION el
nombre de alguna variable, pero sin el símbolo de dólar. Esto es similar a como se crean variables pasadas
por la URL con la matriz superglobar $_GET o campos de formulario con el método POST utilizando la
matriz superglobal $_POST
$_SESSION['estado'] = 1;
$_SESSION['page'] = $pagina;
$_SESSION['nameusr']=$row['nombre'] . " " .$row['apellido'];
$_SESSION['perfil'] = $row->perfil;
$_SESSION['photo'] = $preferencias['img'];
Es preciso para poder acceder a los valores almacenados en variables de sesión iniciar el script con una
llamada a la función session_start( ). Si se utiliza un objeto como variable de sesión, es preciso incluir la
definición de la clase antes de invocar a la función session_start( ) para volver a cargar las variables de
sesión. De esta forma PHP sabe cómo reconstruir el objeto de sesión.
Debe prestar atención a verificar si las variables de sesión están registradas o no. Puede utilizar para ello
las funciones isset( ) o empty( ). Por ejemplo: isset($_SESSION['name']);
Si ya no se va a utilizar una variable de sesión es aconsejable anular su registro. Esto ayudará a liberar
recursos del servidor. Para anular el registro de una variable de sesión puede utilizar la función unset.
Ejemplo
unset($_SESSION['page']);
III. Desarrollo
Paso 1. Crear la página de inicio de sesión o también conocida como página de autenticación de usuarios.
En esta página el usuario introduce su usuario y contraseña para ingresar al sistema. El código de esta
página se muestra a continuación:
login.php
Guia 5 pag.7
<html>
<head>
<title>Autenticación PHP</title>
</head>
<body>
<h1>Formulario de autenticación</h1>
<?php
if ($_GET["errorusuario"]=="si"){
?>
<font color="red"><b>Datos incorrectos</b></font>
<?php
}
else{
?>
Introduce tu nombre de usuario y contraseña
<?php
}
?>
<form action="autenticacion.php" method="POST">
<table border="0">
<tr>
<td>Nombre de usuario:</td>
<td><input name="usuario" size="25" value="" /></td>
</tr>
<tr>
<td>Contraseña:</td>
<td><input name="contrasena" size="25" type="password" /></td>
</tr>
<tr>
<td/><td><input type="submit" value="Inicio de sesión" /></td>
</tr>
</table>
</form>
Para ingresar, debés ingresar <b>usuario</b> en el 1er campo y <b>123</b> en el 2do.
</body>
</html>
Lo que debe notar en el código anterior es el if que verifica si se ha enviado a través de la URL la variable
errorusuario con un valor de “si”. Si es así se muestra el mensaje Datos incorrectos antes del formulario, si
no sólo se piden los datos de autenticación.
El formulario anterior envía los datos a la página autenticación.php la cual se encarga de validar los datos
enviados desde el formulario. Si los datos son correctos, se crea la variable de sesión autenticado. Si no
son correctos redirige al usuario hacia la página de login.php agregando en la URL la variable errorusuario
con el valor “si”. Veamos el código anterior:
autenticacion.php
Guia 5 pag.8
<?php
session_start();
//Conectando a base de datos
$con = mysql_connect("localhost", "root", "123456")
or die("<h3>No se ha podido establecer conexión con el servidor.</h3>");
mysql_select_db("ventas") or die("<h3>La base de datos no se ha encontrado</h3>");
//generando la consulta sobre el usuario y su contrasena
$qr = "SELECT usuario, contrasena, nombre, apellido ";
$qr .= "FROM usuario WHERE usuario = '" . $_POST['usuario'];
$qr .= "' AND contrasena = '" . $_POST['contrasena'] . "'";
//ejecutando la consulta
$rs = mysql_query($qr);
$row = mysql_fetch_object($rs);
Paso 3. Crear un módulo de seguridad para proteger las páginas del sitio
Debe crear una página que se insertará en todas las páginas web de su sitio que desea proteger o restringir
mediante sesiones. El código podría ser como el siguiente:
seguridad.php
<?php
//Inicio la sesión
session_start();
//COMPRUEBA QUE EL USUARIO ESTA AUTENTICADO
if ($_SESSION["autenticado"] == "si") {
}
else{
//si el usuario no está autenticado
//redirigirlo a la página de inicio de sesión
header("Location: login.php");
//salimos de este script
exit();
}
?>
Guia 5 pag.9
Paso 4. Agregar el módulo de seguridad a las páginas que van a tener acceso restringido.
Lo único que debe hacer es agregar el código del archivo seguridad.php en las primeras líneas de los
scripts de las páginas que desea proteger. Puede utilizar la función include o require. Veamos el código del
script aplicacion.php de nuestro ejemplo:
aplicacion.php
<?php
include "seguridad.php";
?>
<html>
<head>
<title>Aplicación segura</title>
</head>
<body>
<h1>Ahora estás en una aplicación segura</h1>
<br>
<br>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
<br>
<br>
<br>
<a href="salir.php">Salir del sistema</a>
</body>
</html>
Básicamente, lo que debe hacerse al salir del sistema es eliminar la sesión y redirigir al usuario a la página
de login.php. Veamos el código:
salir.php
<?php
session_start();
$_SESSION = array();
session_destroy();
?>
<html>
<head>
<title>Contenido no seguro</title>
</head>
<body>
Ahora estás fuera de la aplicación segura.
<br>
<br>
<a href="login.php">Autenticar usuario</a>
</body>
Guia 5 pag.10
</html>
1. Respecto a la tarea de la guia 5 (la tarea que se evaluó para el segundo periodo), realizar las modificaciones
necesarias para que sea una aplicación segura, deberá de hacer un formulario de identificación de usuarios, ya sea
usando sesiones o http, además todas las pagina deberán de contener seguridad, no podrán ser accedidas por
usuarios sin autorización.
V. Fuentes de consulta
Guia 5 pag.11