Funcionamiento del sistema de autentificación en PHP

  • Por
Descripción de las distintas páginas que forman el sistema de autentificación y su funcionamiento, basado en usuario y contraseña.
Un sistema de autentificación es un módulo de seguridad para asegurarnos de que el usuario que visita las páginas es quien dice ser. Por supuesto, sabiendo que ese usuario es conocido, podremos darle acceso a más aspectos de la página que si fuese un usuario desconocido. Pero supongo que, si estás leyendo este artículo, ya conocerás lo que es un sistema de autentificación y lo que deseas hacer es crear uno para tus páginas.

Referencia: Este manual requiere el conocimiento básico de PHP que, en caso de no tenerlo, se puede aprender en nuestro Manual de Programación en PHP.

Esquema de un sistema de autentificación

Vamos a empezar por definir un diagrama para realizar la autentificación de usuario en unas páginas web, que nos servirá para programar luego las páginas ajustándose al diagrama.

diagrama de funcionamiento de un sistema de autentificacion

En la imagen anterior podemos ver el diagrama, que empieza por la página donde se pide un usuario y contraseña para acceder a la aplicación de acceso restringido.

Los datos de autentificación (usuario y contraseña escritos en la página inicial) se envían a la página dibujada con línea de puntos, que se encarga de hacer una comprobación de dichos datos del usuario. Según los datos de autentificación, se redirecciona al navegador a la página de la aplicación restringida, en caso de que sean correctos, o a la página donde volver a escribir el usuario/contraseña, en caso de que sean incorrectos. Esta página la he dibujado con línea de puntos porque no es una página donde se pare el navegador para nada, sino que sólo es una página de paso que redirecciona a un sitio u otro dependiendo de los datos que reciba.

La aplicación de acceso restringido, aparte de mostrar las funcionalidades que queríamos proteger con usuario contraseña, debe de realizar unas comprobaciones de seguridad para saber si se ha pasado con éxito el proceso de autentificación o si se está intentando acceder de manera no permitida a esa página. Esta comprobación la he dibujado como una capa con color verde más oscuro sobre la página de la aplicación. Si no se satisface dicha comprobación (el usuario no se ha autentificado correctamente) se vuelve a la página donde escribir el usuario y la contraseña.

Este es el esquema básico, que espero que se entienda bien. Ahora, veamos algunas preguntas que podría hacerse el lector.

¿Por qué hacemos esta comprobación de seguridad dentro de la aplicación?
Podría ser que alguien conociese la URL de la aplicación de acceso restringido y la escribiese directamente sobre la barra de direcciones del explorador, así que hacemos esta comprobación para saber que realmente no se está accediendo sin pasar por la página que comprueba si el usuario/contraseña es correcto

¿Cómo sabemos que ciertamente se ha pasado por la página que comprueba los datos de autentificación?
Esta comprobación la podríamos hacer de varias maneras, así pues, depende de nuestro script de autentificación y el nivel de seguridad que tratemos de implementar. Un ejemplo simple podría ser crear una variable de sesión en la página que comprueba los datos, si es que eran correctos, y en capa se seguridad de las páginas de acceso restringido comprobaríamos si esa sesión está o no definida.

En caso de desear burlar la seguridad, ¿Cómo podría un usuario entrar a la página de la aplicación si no hay enlaces directos y para pasar a ella necesitamos que nos redireccione la página de comprobación del usuario/contraseña?
Pues de diversas maneras, para empezar, el historial de los ordenadores guarda las URL a las que se ha accedido y cualquier persona podría recuperar la URL de nuestra aplicación con acceso restringido. También se podría probar distintas URL que podríamos imaginarnos como posibles para la aplicación y esperar a acertar con el nombre de archivo en algún momento, incluso esta tarea se la podríamos encomendar a un programa para realizar muchas más pruebas. En cualquier caso, nuestra seguridad no se puede quedar en simplemente que los posibles intrusos no conozcan la dirección de la página.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

borja

08/9/2003
Adicionalmente siempre es conveniente que las zonas seguras se accedan a través de un servidor de conexion seguro.

Los detalles son complejos pero lo normal es que el servidor te redireccione a una versión segura (con el https) para que ningún ordenador entre medias pueda escuchar la contraseña con algún programa que mire las conexiones.

Tu comàñero de oficina o cibercafé puede tener un sistema instalado que grabe todos los datos de la red local. Si la contraseña se manda sin encriptar sólo tiene que gardarla ... y ya está.

macias

18/9/2003
Existe ya una pequeña aplicación basada en php con la que la puedes implementar en tu web rapidamente para el uso de zonas restringidas. Esta es la página para poder bajarlo: http://www.hotscripts.com/Detailed/15291.html

Este desarrollo es español por lo que saber manejarlo os va a resultar facil. Yo lo he utilizado en una página mia y funciona perfectamente.

Alexander Cervantes

26/11/2003
he probado este método de autentifiación de este interesante artículo, y, tengo el siguiente sin sabor, cuando uno ingresa con los datos correctos, la APLICACION SEGURA, no es tan segura puesto que si luego abrimos otras páginas o retrocedemos, y luego queremos regresar a la página regresa sin ningún control de autentificación; hay formas con javascript de evitar esto, pero hay alguna otra forma en php?

carlos

23/2/2004
Estos son los errores que me da y no se como resolverlo:(agradeceria ayuda)

Warning: open(/tmpsess_cd76159ae261705889405f270c9e5df1, O_RDWR) failed: m (2) in C:apachehtdocscarlesexamencontrol.php on line 4

Warning: Cannot add header information - headers already sent by (output started at C:apachehtdocscarlesexamencontrol.php:4) in C:apachehtdocscarlesexamencontrol.php on line 6

Warning: Cannot add header information - headers already sent by (output started at C:apachehtdocscarlesexamencontrol.php:4) in C:apachehtdocscarlesexamencontrol.php on line 17

Warning: open(/tmpsess_cd76159ae261705889405f270c9e5df1, O_RDWR) failed: m (2) in Unknown on line 0

Warning: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/tmp) in Unknown on line 0

José Ramón Damas

29/12/2004
Este post es para responder el post de Alex Cervantes.
Quizás ya no te sea necesario, pero ...

Para corregir ese tipo de acceso "no seguro" cuando alguien abre otra pag o retrocede con el botón del navegador, tan sólo debemos destruir la variable de sesión al comienzo de la pag index.php y lo mismo tras incluir la capa de seguridad en la pag aplicacion.php.
Creo que con ésto corregimos ese detalle, desde PHP sin necesidad de Javascript.
Espero que le sea útil a alguien.
Un saludo.

Jose Manuel

26/2/2005
Hola,
Soy un programador todavia nobel, que le gustaría saber donde me podría bajar el código de estas paginas que se prueban.

Gracias un saludo

RESPUESTA

Para tener mas ejemplos y entender mejor esto de la programación en PHP puedes descargarte el manual de PHP y los talleres de PHP donde vienen bastantes ejemplos.

manual PHP

Jaime

05/7/2005
Me parece bueno el sistema de autentificacion en php. Tienen razon con respecto al tema de la seguridad. Para resolver ese problema se puede implementar algun método de encriptación de datos. En este caso yo estoy manejando el MD5. Es un método sencillo y ade4más se emplea una funcion incluida en el servidor que corre PHP.

edmodi

16/6/2006
Soy nobel en PHP y necesito implementar una aplicación segura sobre una tienda on-line. Mi pregunta es: ¿qué medidas de seguridad debería tener en cuenta?

Erwin Padilla

02/8/2006
Hola;
La verdad seria bueno si me facilitaran el codigo, he revisado casi todo el curso que tienen disponible y aun no encuentro el tema...
Soy novato en PHP y la verdad me gustaria si me podrian ayudar un poco... Please gracias de antemano

gotalfc

31/10/2006
ok perfecto pero lo uqe nunca explican y la verdad me encantaria saberlo es como defines lo que ve el usuario segun el usuario? gracias...

jose

31/5/2007
como podria aser para qe se me enbvie elm cfodigo para esta aplicacion de seguridad a mi msn janber20@hotmail.com deseando utilizarla para la implementacion de una aplicacion en entorno php

Banny Solano

27/8/2007
Pues nada, que este sistema de autenticacion me ah servido mucho para una aplicación que estoy programando es muy básico pero muy útil, como aporte puedo decir que se podría hacer un seguimiento de que usuarios intentan ingresar a la fuerza al sistema, almacenando esos datos ingresados (incorrectos) y agregandolos a variables de sesion, para hacer un seguimiento por ejemplo de ip, como se sabe esas variables de sesion se almacenan en un archivo en una carpeta sessions del php.

fernando

21/11/2007
Bien amigos gracias por sus exfuerzos pero les digo que todas las aplicaciones que hago dentro de mi ordenador me funciona perfectamente, lo increible y los dolores de cabeza es cuando la subo a un servidor como este php

quiero autentificar diversos usuarios para enviar a una pagina segura pero las caracteristicas de lo que yo hago no me estan dando resultado solo obedece auno de ellos digamos al ultimo registro de abajo y los demas nada que ver aqui esta el codigo:
<?PHP
//Otra tienda
if ($_POST["usuario"]=="laura" && $_POST["contrasena"]=="789"){
//usuario y contraseña válidos
//defino una sesion y guardo datos
//habilitar la salida del buffer
ob_start();
session_start();
session_name("autentificado");
$_SESSION["autentificado"]= "SI";
header ("Location: downloadfilexxx.php");
//menudeo
}if ($_POST["usuario"]=="pedro" && $_POST["contrasena"]=="159"){
//usuario y contraseña válidos
//defino una sesion y guardo datos
//habilitar la salida del buffer
ob_start();
session_start();
session_name("autentificado");
$_SESSION["autentificado"]= "SI";
header ("Location: downloadfilexxx.php");
}else {
//si no existe le mando otra vez a la portada
header("Location: index.php?errorusuario=si");
}
?>
como ven hice de todo y nada a ver quien me podria ayudar con esto, quiero decirles que esto es el control.php y es donde estan registrados los posibles usuarios.
espero sus respuestas gracias
Fernando

FERNANDO

21/11/2007
Hola amigos: aquí estoy de nuevo quiero plantearle mi otro problema tengo un autentificador de usuario bueno que por el momento me funciona solo para uno que lo grandioso seria que sean diversos, pues bien hice un form para subir archivos al servidor en mi computador funciona perfectamente pero en servidores no quiere funcionar sale este error:

Notice: Undefined variable: boton in G:IPLessLocalUserconuti.com.dohttpdocsCibertwebdownloadfilexxx.php on line 2

pues bien el codigo es este:

<?
if($boton){
if (move_uploaded_file($_FILES['archivo']['$usuario']['tmp_name'])){
echo "la direccion de descarga es: <br />h**p://cibertweb.com.do/ups/$nombre/$archivo";
if($_FILES['archivo']['size'] < 2000000)
{

if($_FILES['archivo']['type']=="image/gif" || $_FILES['archivo']['type']=="image/jpeg" || $_FILES['archivo']['type']=="image/pjpeg" || $_FILES['archivo']['type'] =="application/msword" || $_FILES['archivo']['type'] =="application/pdf") {
copy($_FILES['archivo']['tmp_name'], $_FILES['archivo']['name']);
$subio = true;
}
}
}

if($subio) {
echo "El archivo subio con exito";
} else {
echo "El archivo no cumple con las reglas establecidas";
}
die();
}

?>
<html>
<head>
<title>Download Archivos Web - CibertWeb</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body >
<center>
<TABLE width="400" border="1" bgcolor="#9ac2e8">
<tr>
<td width="400">
<br>

<form action="<?=$PHP_SELF?>" method="POST" enctype="multipart/form-data" name="form1">
<p align="center">Archivo
<input name="archivo" type="file" id="archivo"><BR>

<FONT COLOR="GRAY" SIZE="2">(Solo formatos GIF - JPG - DOC y PDF menores a 2MB)</FONT>
</p>

<p align="center"><input name="boton" type="submit" id="boton" value="Enviar"></p>
<br>
</td>
</tr>
</table>
</center>
</form>
</body>
</html>

ojala alguien me ayude con toda gratitud su amigo y servidor

Fernando

jesus r.v.

28/11/2007
en realidad ya lo hice tal y como se muestra, pero ahora tengo un problema con las cabeceras o header al momento de subir mi pagina al sitio y enlazar a la base de datos me manda un error de CGI-BIN, eso pasa al momento de introducir usuario y contraseña,si entra a esa pagina correspondiente pero me sigue mandando ese error, no saben como corregir eso, urgente.......... por favor.

Juan Gabriel Letelier Martínez

30/1/2008
El script alternativo para autentificar usuario solo trabaja para el primer login registradoo en la base. No toma los login y password de los siguientes usuarios registrados. si alguien me dice por que y como se arregla, se lo agradecería.

Juan Carlos

28/1/2009
tengo una aplicacion donde se usa la funcion imap_open para este tipo de seguridad y no me funciona, en realidad soy nuevo y estoy trabajando sobre una aplicacion que ya esta echa,, necesito orientacione....
gracias

enriquerg37

08/4/2009
Ayuda a validar usuario y contraseña
Hola a todos, vengo por aca porque necesito ayuda con eso de la validacion de usuario y contraseña. Po lo que vi como funciona este ejemplo me di cuenta que es exactamente lo que necesito, que me funcione como esta ahi. ¿Sera que por favor me pueden decir como es ese codigo para lograr hacer lo que muestra ese ejemplo? por favor es que soy nuevo en esto de desarrollo web.

Gracias.

edilberto

14/8/2009
codigo fuente
soy nuevo en programacion php y por fa necesito el copdigo fuente de la validacion de usuarios en acceso a las paginas gracias.

Francisco Javier

12/3/2010
Ayuda
Por favor les pido que si pueden me manden los archivos que hay que subir al servidor porque por mas que lo intento no consigo que fucione
O lo agradeceria mucho

gracias
gracias
gracias

drigu

17/5/2010
Validación Usuario
Tengo un servidor apache con una base de datos SQL.

Cuando intento identificarme en la página obtengo el siguiente resultado:

Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'root'@'localhost' (using password: YES) in C:wampwwwlaseroad.php on line 39

Warning: mysql_select_db(): supplied argument is not a valid MySQL-Link resource in C:wampwwwlaseroad.php on line 40

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in C:wampwwwlaseroad.php on line 68

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:wampwwwlaseroad.php on line 70

Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in C:wampwwwlaseroad.php on line 81

Warning: Cannot modify header information - headers already sent by (output started at C:wampwwwlaseroad.php:39) in C:wampwwwlaserautenticacion.php on line 30

El código al que se refieren los errores es el siguiente:

<?php
/**
* Clase OAD
*
* Contiene los métodos que acceden a base de datos
*/
class OAD
{
/**
* Atributos de la clase DAO
*
* contienes los valores necesarios para la conexión a la fuente de información
* usuario, contraseña, host y base de datos que contiene la información
*
* @acces: private
*/
var $user;
var $pass;
var $host;
var $bd;

/* Constructor */
function __construct()
{
$this->user = 'root';
$this->pass = 'laser';
$this->host = 'localhost';
$this->bd = 'laser';
}

/**
* Funcion para conectar a la base de datos
*
* @return $db: manejador de la base de datos
*/
function ConectaBD()
{
// Conexión a la base de datos
$con = mysql_connect($this->host, $this->user, $this->pass);
mysql_select_db($this->bd, $con);
return $con;
}
...
En principio parece un error de acceso al servidor apache, pero las contraseñas y nombres de usuario coinciden.
Un saludo.

megan

29/6/2010
codigo compara
hola si es lo que se describe en el ejemplo lo que yo quiero hacer pero me gustaria que explicaran como validar lo que se escribio en los campos del formulario con lo que esta en la base de datos es decir; como comparo lo que escribio el usuario para verificar que ese usuario si esta en mi base de datos

la conexion ya esta pero aun no se como hacer eso

ernesto

18/7/2010
Excelente el ejercicio
los felicito, el codigo me ilustro mucho, es muy bueno. Me gustaria que lo colgaran completo para descargarlo, ya que apenas empiezo a conocerlo.

gracias.

Juan Muñoz

08/9/2010
Pregunta
necesito un codigo que pida una contraseña y un usuario, y que existan diferentes usuarios que redirijan a diferentes páginas. no se si me explico.... porfavor enviame el codigo a mi email.

jose SIS

10/3/2011
requiero hacer consultas con la conexion php mysql
hola !saludos¡ hacce tiempo que sigo sus novedosas explicaciones, lo siguiente: tengo dificultad para accesar datos desde los diferentes botones,como agregar,modificar, consultar, eliminar desde php a una base de datos a mysql, ¿como logro que sea efectivo y ver que necesito para que esto sea posible ?

Sergioslax

23/9/2011
Necesito tu ayuda Miguel
Hola Miguel, Soy de San Juan, ARG. Necesitaria de tu ayuda soy novato en esto, te comento mas o menos como seria lo que busco:

*Necesito crear un Login y un Password para un nuevo proyecto que estamos haciendo que se trata de la busqueda de personas. ese usuario y contraseña tendria que tener privilegios de entrar a la web y que vea una sola parte de ella en este caso el: "Sistema de Busqueda de personas", Una vez logueado X persona que solo tenga accesso a la Carga de datos y foto de algun menor desaparecido, que tenga un panelcito de control y le de la opcion de carga de imagen o modificacion de info de la persona desaparecida. Suponiendo que el cargador quiera ingresar una nueva persona para su busqueda "Siempre hablando de busqueda de personas" y luego que salga en la plantilla de fotografias+info del desaparecido. que le pida el DNI del desaparecido para comprobar que no haiga duplicado de personas es decir que la BD compruebe eso. si no es mucho pedirte me decis tu mail enviamelo por msj privado y te comento bien. por favor es de urgencia es para los niños desaparecidos.

Samir

13/12/2011
Verificar variable de session
Hola muy buena la parte teorica, solo quiero saber si tengo que poner un script php en cada pagina para verificar que el usuario paso por el formulario de inicio de sesion, hay alguna forma de automatizar esto, es decir no tener que incluir la verificacion en cada pagina de mi sitio.

Lofthem

29/2/2012
Como bloquear la pagina, despues de 3 intentos fallidos de inicio de session, sin base de datos conectada.
Pues quisiera saber como implementar que con ingresar 3 veces mal los datos del usuario, ya no deje intentar iniciar la sesión, y pues en este link esta la carpeta con los archivos que uso, todo funciona bien, pero solo quisiera agregar ese detalle.
No pongo aqui los codigos, porque creo que sera menos entendible, o almenos eso creo yo.
PD: Para todos los que vean esta pregunta en un futuro, descarguen el archivo y chequenlo, y asi sabran como implementar la respuesta que espero me puedan dar!!! Saque los codigos de este mismo manual, oviamente, pero a mi modo, o bueno un poquito...

De antemano Gracias.

http://www.mediafire.com/?5qwudy3303o6btm

ArianWolf

10/3/2012
Lofthem, indigena asqueroso
Lofthem, indigena asqueroso