P. 1
Autenticación de usuarios y Sesiones en PHP

Autenticación de usuarios y Sesiones en PHP

4.83

|Views: 33.660|Likes:
Publicado porinfobits

More info:

Published by: infobits on Dec 10, 2008
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

08/13/2013

pdf

text

original

Tema

:

Autenticación de usuarios y Sesiones en PHP

Facultad: Ingeniería 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 $_SERVER['SERVER_SOFTWARE'], $_SERVER['PHP_AUTH_USER'] y $_SERVER['PHP_AUTH_PW']

establecidas

son:

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) Web oficial de la aplicación SQLiteManager

Sitio WEB: http://www.sqlitemanager.org/

Guia 5 pag.11

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->