You are on page 1of 11

Tema:

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

II. Introducción Teorica

¿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:

1. Utilizando autenticación con htaccess de Apache


2. Utilizando autenticación http con PHP
3. Manejando sesiones

1. Utilizando autenticación con htaccess de Apache

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.

2. Utilizando autentificación HTTP con PHP

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)

if($_SERVER['PHP_AUTH_USER'] != 'user' || $_SERVER['PHP_AUTH_PW'] != '123456'){


//Si el visitante no ha introducido sus datos o si los
//datos proporcionados no son correctos redirigirlo a
//la ventana de autenticación básica HTTP
header('WWW-Authenticate: Basic realm="Realm-Name"');
if(substr($_SERVER['SERVER_SOFTWARE'],0,9) == 'Microsoft'){
header('Status: 401 Unauthorized');
}
else{
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{
//Si estamos acá es porque el usuario introdujo los datos 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;
}

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&aacute;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)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">


<html>
<head>
<title>Autenticaci&oacute;n de usuarios</title>
</head>
<body>
<?php
if(isset($_POST['user']) && (isset($_POST['pass']))){
$pwfile = fopen("users.txt", "a");
fputs($pwfile, $_POST['user'] . ":" . crypt($_POST['pass'], "pw") . "\n");
fclose($pwfile);
?>
user <?php echo htmlspecialchars($_POST['user']) . ":" . crypt($_POST['pass'], "pw") ?> added
<?php } ?>
<form method="POST" action="<?php echo $_SERVER['PHP_SELF'] ?>">
<table>
<tr>
<td>
<label for="user">Usuario: </label>
</td>
<td>
<input type="text" name="user" size="25" maxlength="25">

Guia 5 pag.4
</td>
</tr>
<tr>
<td>
<label for="pass">Contrase&ntilde;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

Los pasos básicos para el seguimiento de una sesión son:


1. Iniciar la sesión
2. Comenzar a registrar las variables de sesión necesarias
3. Utilizar las variables de sesión en todos los scripts que lo requieran
4. Anular las variables registradas
5. Eliminar la sesión

Iniciar una Sesion en PHP

Existen dos formas de iniciar sesiones en PHP:

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.

Registrar una variable de sesion

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

Un ejemplo de registro de una variable de sesión es el siguiente:

$_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']);

NOTA IMPORTANTE: El uso de las funciones session_unregister() y session_unset() ya no es necesario


ni recomendable. Para anular el registro de todas las variables utilice:
$_SESSION = array();

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.

Paso 2. Validar los datos enviados desde el formulario

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

//verificando si hay un usuario con ese password mediante numrows


$nr = mysql_num_rows($rs);
if($nr == 1){
//usuario y contraseña válidos
//se define una sesion y se guarda el dato session_start();
$_SESSION["autenticado"] = "si";
$_SESSION["usuario"] = $_POST['usuario'];
$_SESSION["nombreusr"] = $row->nombre . " " . $row->apellido;
header ("Location: aplicacion.php");
}
else if($nr <= 0) {
//si no existe se va a login.php y pone el valor de error a SI
header("Location: login.php?errorusuario=si");
} ?>

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>

Paso 5. Crear el script para terminar la sesión y salir del sistema

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>

IV. INVESTIGACION COMPLEMENTARIA

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

• Libro: Proyectos Profesionales PHP. Autor: Ashish Wilfred.


• Libro: PHP5 a través de ejemplos. Autor: Abraham Gutiérrez y Gines Bravo editorial Alfaomega
• Sitio WEB: www.php.net/manual/es
• Sitio WEB: http://www.sqlite.org/ Sitio Oficial de SQLite (en inglés)
• Sitio WEB: http://www.sqlitemanager.org/ Web oficial de la aplicación SQLiteManager

Guia 5 pag.11