Control de los datos de autentificación en PHP

Valoración del artículo:
Aquí veremos si los datos de autentificación son correctos y dependiendo de si lo son o no, se redirigirá al navegador a la aplicación segura o al formulario inicial, respectivamente.
Publicado: 19/12/02
Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.
Esta página será encargada de decidir si los datos de configuración son correctos y actuar en consecuencia. Dependiendo del nivel de seguridad que queramos aplicar a nuestra aplicación, esta página será más o menos complicada.

En un principio no deseo liar mucho las cosas, así que explicaré una versión muy reducida de este archivo de control, en la que se comprueba si el usuario y contraseña sean dos valores específicos. Esto tiene la desventaja que sólo podemos crear un usuario/contraseña distinto y no un sistema que permita muchos usuarios distintos. Bueno, en realidad si que permitirá que accedan muchos usuarios a la vez, pero utilizando todos el mismo nombre de usuario y contraseña.

En aplicaciones más avanzadas podríamos tener en una base de datos una lista de usuarios con sus contraseñas. Entonces, en este archivo de control deberíamos hacer una búsqueda para ver si existe una correspondencia en la base de datos de ese usuario con esa contraseña. Esto lo veremos en adelante, ahora nos quedamos con la versión reducida.

Después de la comprobación podrán pasar dos cosas:
Si los datos son correctos, definirá una variables de sesión que servirá para saber que ese visitante ha sido validado correctamente y tiene permiso para acceder a la aplicación. Además redireccionará al visitante a la página de la aplicación restringida.
Si el usuario/contraseña no era correcto, se envía al navegador a la página de inicio pasando la variable errorusuario=si, que indica que ha habido un error en la autentificación.

El código se puede ver a continuación:

<?
//vemos si el usuario y contraseña es váildo
if ($_POST["usuario"]=="miguel" && $_POST["contrasena"]=="qwerty"){
    //usuario y contraseña válidos
    //defino una sesion y guardo datos
    session_start();
    $_SESSION["autentificado"]= "SI";
    header ("Location: aplicacion.php");
}else {
    //si no existe le mando otra vez a la portada
    header("Location: index.php?errorusuario=si");
}
?>


Referencia: Dos enlaces a documentación relacionada en nuestro manual de Programación en PHP:

Aprender el uso de sesiones http://www.desarrolloweb.com/articulos/320.php?manual=12

Aprender el paso de variables por formulario http://www.desarrolloweb.com/articulos/318.php?manual=12

Comentarios
Fueron enviados 34 comentarios al artículo
24 comentarios no revisados
10 comentarios revisados:
Por: freddy nunez
11/12/03
saludos, he puesto en practica este script y funciona pero:
1.la pagina protegida con clave a la q se desea accesar, una vez hecho esto, se ve la direccion en la barra de direcciones. por lo tanto , uno puede puentear , e irse de frente a esa direccion y pasar por alto el password y el usuario.
como solucionan este problema

RESPUESTA

Aunque escribas la dirección de la página directamente en tu navegador, no podrás acceder al contenido de acceso restringido, puesto que el sistema comprueba si se ha realizado la autenticación del usuario a través comprobar si realmente existen las variables de sesión que se deben de crear en la página de acceso.

De modo que, si no accedes pasando por la página de acceso, no se crearán las correspondientes variables de sesión y no podrás acceder a la página restringida. gracias

Por: Marc0s
14/2/04
Tal vez lo mejor sea incluir todo dentro de un directorio, menos los dos archivos php index.php y el de comprobacion del usuario. Ese directorio lo podemos proteger despues (modificando el archivo de configuracion correspondiente).
Por: Pablo
24/2/04
Me aparece el siguiente error: Warning: session_start(): open(/tmp\sess_196f11545b1b5bcbe29cb6d206b97bf1, O_RDWR) failed: No such file or directory (2) in D:\www\Test\control.php on line 6 Alguien me puede ayudar????

RESPUESTA

Te has fijado si el directorio ese, en el que intenta escribir información PHP está creado y con permisos de escritura? Es decir, tienes creado el directorio tmp?

Por: fasp
12/3/04
pues existen muchas formas para evitar "puentear", pero la que yo haria seria la de usar POST en vez de GET en la forma de la 1era pagina en <form method="POST">....</form> de esta forma se esconde los datos a pasar pa otra pagina, pero pues lo mejor seria algun tipo de encriptamiento.

Y ya entrados en el tema y viendo que a ti si te funciono el script, a mi me marca un error en la 1era pagina (index.php), dice ke la variable "errorusuario" no ha sido declarada, como soluciono esto?, no es nada mas declarla debe de haber algo mas.
Por: Andrés
27/5/04
Muy bueno el artículo! Sólo quiero comentar un detalle: si el usuario no tiene las coockies habilitadas en su navegador, no funciona. Para solucionarlo, en el header que redirecciona a aplicacion.php hay que propagar el identificador de sesion. Sería algo como esto:
header ("Location: aplicacion.php".SID);
}else {
    //si no existe le mando otra vez a la portada
    header("Location: index.php?errorusuario=si");
}
Saludos y gracias por compartir sus conocimientos.
Por: Andres
27/5/04
Correccion: en el comentario que hice antes, el codigo correcto para propagar el SID es el sigte:
header ("Location: aplicacion.php?".SID);
(Me faltaba el '?').
Un saludo.
Por: Alfonso Flores Honores
13/7/04
El articulo esta excelentey funciona a las mil maravillas, con la excepción que no trabaja cuando el register_globals esta en OFF ...alguien sabe como corregir esto
Por: Halcon
12/7/05
Leia por ahi por artes del destino en su foro, si meten ésto en la cabecera antes de aplicacion.php o en cualquier archivo php que deseen que el usuario visualice solo si está autentificado, evitan que si escriben en la url del navegador se visualice el archivo, si el usuario no está autentificado en la session redirecciona a index.php

<?php
session_start();
if ($_SESSION["autentificado"]!="SI") {
header("Location: index.php");
}
?>
Por: Dani Alonso
09/3/06
De esta forma podreis crear más usuarios:

<?
//Forummed
if ($_POST["usuario"]=="pedro" && $_POST["contrasena"]=="123"){
//usuario y contraseña válidos
//defino una sesion y guardo datos
session_start();
$_SESSION["autentificado"]= "SI";
header ("Location: priv_fm159r3.php");
//Styl Computer
}elseif ($_POST["usuario"]=="dani" && $_POST["contrasena"]=="456"){
//usuario y contraseña válidos
//defino una sesion y guardo datos
session_start();
$_SESSION["autentificado"]= "SI";
header ("Location: priv_st196w1.php");
//Otra tienda
}elseif ($_POST["usuario"]=="laura" && $_POST["contrasena"]=="789"){
//usuario y contraseña válidos
//defino una sesion y guardo datos
session_start();
$_SESSION["autentificado"]= "SI";
header ("Location: priv_yt966z3.php");
}
elseif ($_POST["usuario"]=="pedro" && $_POST["contrasena"]=="159"){
//usuario y contraseña válidos
//defino una sesion y guardo datos
session_start();
$_SESSION["autentificado"]= "SI";
header ("Location: priv_fm159r3.php");
}else {
//si no existe le mando otra vez a la portada
header("Location: index.php?errorusuario=si");
}
?>

lex85
ayuda!!!
28/4/09
q tal, bueno yo apens me estoy iniciando en php con mysql, he hecho lo que he leido en el manual o articulo, primero lo estoy haciendo de forma sencilla donde yo escribi el usuario en codigo y le doy acceso con el if, hago lo q el codigo dice tanto en index.php control.php y aplicacion php, al momento de llenar mi datos en el formulario le doy entrar pero me manda a la pagina de control y no hace nada todo en blanco no me manda a mi pagina de aplicacion.php o si meto datos erroneos tampoco me dice que esta mal, si alguien pudiera saber q pasa agradesco su ayuda..

mientras seguire intentando

Manuales relacionados
Categorias relacionadas
El autor
Lectura recomendada
Compra este libro en Agapea, la librería urgente a domicilio.
Últimas noticias
Alojados en el grupo