Control de los datos de autentificación en PHP

  • Por
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.
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

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

freddy nunez

11/12/2003
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

Marc0s

14/2/2004
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).

Pablo

24/2/2004
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?

fasp

12/3/2004
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.

jano

12/5/2004
hola... resulta que baje el codigo y todo .. lo puse a correr pero no me hace nada ,.. osea cuando escribo la clave que sale alli me sale igual el mensaje arriba
index.php?errorusuario=si
estando bien escrito ..
parece que no me soporta algo del php

bueno yo tengo una maquina linux con php version 4.0.4 tamcopo me muestra el color rojo cuando me eq

Andrés

27/5/2004
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.

Andres

27/5/2004
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.

Alfonso Flores Honores

13/7/2004
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

MMR

20/7/2004
HOLA, ESTOY HACIENDO MIS PRACTICAS PROFESIONALES EN LA CUAL INSTALE UN SERVIDOR APACHE, PHP Y MYSQL CON SU RESPECTIVO PHPMYADMIN Y VOY A REALIZAR UNA PAGINA WEB Q POR MEDIO DE UN USUARIO Y CONTRASEÑA (COMO EL EJEMPLO)ACCEDA A UNA PAGINA DETERMINADA DEPENDIENDO EL NOMBRE DEL USUARIO, PERO CORRI ESTE PROGRAMA COPIANDO LOS SCRIP Y ME JECUTA ERRORES; OJALA PUEDAN AYUDARME

Jose Alfredo

21/7/2004
Si el script de autentificacion tiene un problema de seguridad yo lo he ejecutado y si direcciono directamente a la pagina de aplicacion en el navgador si lo hace...el problema esta en el scrip de seguridad.php..estoy tatanto de olucionar el problema pero todavia no lo encuentro..

Freddy Hernandewz

06/9/2004
Hola amigos, instale el script en mi pc, y funciona de maravilla. Solo aparte del problema que mencionan sobre la sesion y su definicion yo encuentro otro, y de verdad quiero orientacion al respecto. Cuando presiono el boton entrar sin ingresar ningun dato en los campos de user y clave me ingresa igual a la pagina que deberia estar protegida.

Si alguien pude decirme que hacer, yo pienso que es un else donde se pone lo que pasa si no hay nada escrito.

kecodelafe

25/1/2005
hola a todos!! me parece muy bueno este manual.
Me funciona bien salvo un problemita..
cuando ingreso a la página restringida, ingreso sin problemas.. pero cuando voy a otro vínculo de mi sitio e intento regresar.. no me reconoce!!! tengo que nuevamente loguearme... esto puede resultar fastidioso a los visitantes que tengan que registrarse a cada instante!! ¿no? ¿hay alguna solución a esto?

Halcon

12/7/2005
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");
}
?>

Jose

11/12/2005
Tengo un problema con la parte en la de introducir el nombre y clave del usuario, solo me envia al control.php y no me direcciona a la aplicacion.php.
Alguien sabe como solucionarlo le agradeceria mucho si me lo pudira decir.

Marta

24/1/2006
Por lo de enviar sólo al control.php y no direccionar a la aplicacion.php...
Prueba con editar tu php.ini y cambiar la parte que dice "session.save_handler = user" por "session.save_handler = files" puede que sea eso.

RODOLFO

20/2/2006
Buenas tardes mi inquietud es la siguiente quiero hacer una página con restricción copie los mismo códigos que ustedes utilizan pero no me funciona la parte de control no se por que diseñe una pagina con el nombre de control y pegue los códigos pero no me funciona a la hora de realizar la prueba. Gracias

JoseA

27/2/2006
En relación a lo que comentan sobre que solo funciona con Register Global en ON, la opción para poder hacer que funcione con el Register GLobals en OFF es colocando esta sentencia en la primera linea de los scripts: extract ($_REQUEST); . Por lo menos en esto funciona, pero no en todos los casos sucede así. SAludos.

Dani Alonso

09/3/2006
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");
}
?>

RICARDO PARDO

02/10/2006
Tienes algun recurso PHP que sirva para recuperacion de clave cuando el usuario la olvida, cambia o pierde y no la recuerda la que se le envia al correo?
Gracias

Angie

08/2/2007
¿Todos estos procedimientos sirven para las paginas de googlepages.com?, en que página se pone el usuario y nombre que se debe autenticar, ya que si se pone el usuario correcto o incorrecto trata de buscar una pagina llamada control.php??
Necesito una respuesta urgente! gracias!!

rodrigo

05/5/2007
pruebo y me da el siguiente error,,
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:AppServwwwPRACTICAautenticacioncontrol.php:2) in C:AppServwwwPRACTICAautenticacioncontrol.php on line 7

Warning: Cannot modify header information - headers already sent by (output started at C:AppServwwwPRACTICAautenticacioncontrol.php:2) in C:AppServwwwPRACTICAautenticacioncontrol.php on line 9

Me podra alguien dar una mano. MIL GRACIAS

esther

21/6/2007
cuando ejecuto index.php me sale este error:

Warning: Cannot modify header information - headers already sent by (output started at c:apachehtdocsproyectocontrol.php:6) in c:apachehtdocsproyectocontrol.php on line 39

y en la linea 39 tengo puesto:

header("Location: index.php?errorusuario=si");


que pasa???

djacedj

28/6/2007
Para el problema del header location:

Lo más normal es que al pegar el código te hayas dejado un espacio o salto de linea antes de la entrada <?php o <? y eso hace que Location no funcione. Prueba a eliminar ese espacio o salto de linea y deja el inicio del codigo php completamente al inicio de la página.

Un saludo.

eduardo

10/10/2007
el script no me funciona, es decir, aun sin colocar los datos necesarios igualmente ingresa a la pagina control.php

ke hago??

xfa paso x paso, ke no se mucho sobre php

Jorge

25/1/2008
Copio los scripts tal cual estan, pero a la hora de introducirel usuario y la contraseña siempre me manda al index con error, incluso cuando pongo miguel y qwerty, no se que es lo que pasa por cierto instale apacha y php con un executable llamado AppServ ya traia apache, php, mysql y myphpadmin
soy nuevo!

sofia

19/3/2008
Hola! Estoy intentando utilizar este código pero me surge un problema.

Mi código es el siguiente:

<html>
<?
//vemos si el usuario y contraseña es váildo
if ($_POST["user"]=="user" && $_POST["password"]=="password"){
//si el usuario y contraseña son válidos ir a URL especificada
session_start()
header ("Location:http://www.dominio.edu.uy/carpeta/nombre.htm");
exit;

}
else {
//si el usuario y/o contraseña no son válidos emitir el siguiente mensaje de error
echo "El usuario y/o contraseña no es válido";
}
?>

<p>&nbsp;</p>
<font size="2" face="Arial, Helvetica, sans-serif"> <a href="index.htm">VOLVER</a>
</html>

El mensaje de error que me da es el siguiente:
Parse error: syntax error, unexpected T_STRING in /home/argos/public_html/pruebasofi/accion_index.php on line 7

Si el usuario y contraseña no son correctos sale el mensaje que puse, o sea que la verificación de datos la está haciendo bien...
¿Alguien sabe si hay algún error en la función header que usé por el que no me abra la página indicada? ¿Tiene que ver con que quiero ir a un htm en lugar de un php?

Muchas gracias!!

sofia

19/3/2008
Recién envié un comentario porque no lograba que me funcionara el código PHP, pero seguí intentando y encontré el problema: tenía puesto <head> al principio del documento. Así que eso ya quedó. Era muy básico pero como soy nueva en esto no me había dado cuenta :(

Mi consulta ahora es la siguiente: ¿Cómo hago para que no se pueda acceder directamente a la página poniendo la dirección en el navegador? Es una página htm, ¿debería ser php?

Muchas gracias! Me ha resultado muy útil este sitio.

Mauricio

03/12/2008
Primero que todo, agradecer por tan buena documentacion de este sitio web, les felicito.

Estoy trabajando en esto pero en el momento de acceder me esta presentando un problema, no me redirecciona ni a la pagina aplicacion.php, ni al index.php, solo se queda en blanco y en la barra de direcciones queda la ruta del scrip control.php, por que me esta sucediendo esto, alguien que me pueda sacar de la duda.

De antemano gracias, y un cordial saludo.

juan

16/3/2009
hola, he puesto todos los archivos como dice aqui y cuando hago el login, sea bien o mal, me sale una pagina en blanco. En la barra poner que se trata de archivo control.php pero no me redirecciona a ninguna otra. ¿Que hago mal?
<?
//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: login.php?errorusuario=si");
}
?>

lex85

28/4/2009
ayuda!!!
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

Jorge

27/8/2009
una duda
hola, soy nuevo en esto de php, le entiendo maso menos, pero no me queda claro donde hay que poner ese codigo donde definimos la contraseña y el usuario, se pone en el mismo index.php o donde? que alguien me aclare esa dude por favor.

PABLO CESAR

28/9/2009
tengo problemas
ola que tal apenas estoy aprendiendo php y entre asu foro y cheque el codigo pero me sale este error
Warning: Unknown: failed to open stream: No such file or directory in Unknown on line 0

Warning: Unknown: Failed opening 'C:Archivos de programaxampphtdocsproyectocontraseña.php' for inclusion (include_path='.;C:Archivos de programaxamppphppear') in Unknown on line 0

si alguien me pudiera ayudar le agradeceria

FOVOR

05/11/2009
No aparece nada
Saludos, me pasa lo mismo que a un compañero que ya comentó aqui, al mandar a control.php me deja ahi, no hace nada, no redirecciona ni nada, solo la página en blanco. Lo peor es que tengo la impresión que el día de ayer si funcionaba, pero no estoy seguro.

FOXVOR

05/11/2009
LISTO RESUELTO!!!
Tengo la solución a mi propia pregunta y al de alguien mas aqui, jaja, espero que a alguien le sirva, la cosa era que al entrar a control.php no hacía nada, se quedaba ahí, parece ser algo sencillo de considerar:

Algunas configuraciones no aceptan la forma "ligera" de php, y usan la forma "estricta" por lo que al poner: <? para indicar php, si se usa el modo estricto, no lo reconoce, hay que poner: <?php para que lo reconozca, al cerrar es normal solo con ?>

Luis Mosquera

25/11/2009
Control de los Datos de autenticacion en php
Hola Miguel, excelente tu explicacion, sin embargo no logro hacer que funcione el codigo, probablemente porque yo tengo en mysql una tabla de usuarios, passwords y nivel de acceso al cual previamente he chequeado y autenticado, mi pregunta inicial es si por cada pagina protegida debo volver a chequear los datos del usuario? tambien intente usar tu sugerencia del codigo con la variable register_global en on y en off y no funciono. Inclusive tambien intente el comentario de uno de los amigos con el .SID y tampoco logre hacer que funcionara, que sugieres?

Saludos y mil gracias....

Jaime Arderius

30/11/2009
Dos sesiones con un usuario
Hola,

Genial, me funciona perfecto. La única cosa es que sí una persona ya está logado y otra persona desde otro PC introduce el mismo usuario y seña, también entra. Lo ideal es que a esta segunda persona que intente entrar le salga un mensaje del tipo: Usuario ya logado. Cómo puedo hacer esto?

Un saludo

bocho0610

11/1/2010
duda...
y esto como se hace para sacar el usuario y la pass desde la base de datos?

Hugo Emiliano

26/2/2010
PROBLEMA CON HEADER PHP
Tengo un problema en un codigo que acople a mi web en la parte última en la condición quiero reeedirecionar al index.php pero el header no me pela, este es mi código:

<?php
include 'main/funciones.php';
$con=conecta_bd();
$Sbd=mysql_select_db('consulta',$con);

session_start();
$email=$_POST['email'];
$password=$_POST['password'];
//echo $email;
//echo $password;
//session_start();
if(trim($HTTP_POST_VARS["email"]) != "" && trim($HTTP_POST_VARS["password"]) != "")
{
$email = strtolower(htmlentities($HTTP_POST_VARS["email"], ENT_QUOTES));
$password = $HTTP_POST_VARS["password"];

$result = mysql_query('SELECT password, email FROM usuarios WHERE email=''.$email.''');
if($row = mysql_fetch_array($result))
{
if($row["password"] == $password)
{
$_SESSION["k_username"] = $row['email'];

}
else
{
echo "<script Language="JavaScript"> <!-- alert("SU PASSWORD ES INCORRECTO. INTENTELO DE NUEVO") location.href='index.php' ; //--> </script>";
}
}
else
{
echo "<script Language="JavaScript"> <!-- alert("EL USUARIO NO EXISTE EN LA BASE DE DATOS") location.href='index.php' ; //--> </script>";
}
mysql_free_result($result);
}
else
{
header("Location: index.php?error=si"); //ESTA ES LA PARTE QUE NO JALA.
}
mysql_close();

?>

rojeda

16/9/2010
problema
que sucede si alguien conoce como se nombra la variable de session y realiza un script asignándole los valores correctos a esta variable? de esta manera puede entrar en cualquier página de nuestro sitio
además de encriptar la clave y hacer este trabajo con sesiones que más podemos hacer para evitar entradas no autorizadas?

franklevel

21/9/2010
Sugerencia
Buenas , este será mi primer comentario. El script está muy bueno y supongo que que hasta donde va es para principiantes, sin embargo, permitanme sugerir codificar sólo lo necesario. Me refiero al hecho de crear una varible de sesión como $_SESSION["validado"] = "SI", lo digo por lo siguiente, usualmente en una aplicación necesitarás saber quien se ha autenticado, asi pues luego de comprobar que los datos de accesos son correctos, me conectaría a la BD y creo una variable con el ID del usuario por ejemplo, con esto me basta para saber que ya ha iniciaco sesión alguien registrado. Pienso que agregarle "Autenticado" sería redundar, cosa que no es bien vista o no existe en la filosofía DRY. Obviamente veo que el script apenas empieza y no se conecta a la BD aún, pero veo que la sugerencia es necesaria.
Saludos.

cexar

15/11/2010
buen post
gracias me funciono +10

eduardo_carrera-599106

13/1/2011
autenticacion automatica
Hola como estan, leyendo el articulo observo que puede adecuarse a un desarrollo que estoy haciendo.
Tengo un directorio protegido por contraseña por .htaccess y necesito ejecutar una pagina de dicho directorio sin que solicite pagina de login, es decir necesito pasarle los parametros desde un PHP anterior.

A ver si me explico, el usuario ingresa al index y selecciona la opcion ventas luego toma el control el ventas.php que redirecciona a la pagina necesaria que se encuentra en el directorio protegido , ahi sale la pantalla de login.
Necesito saber como hacer para que el ventas.php llame a la pagina del directorio protegido sin que solicite el usuario y la password. O otra seria autenticarme antes en dicho directorio asi cuando llamo al php ya tengo los permisos.

Se entiende? Alguien se le ocurre como hacerlo?
Muchisimas gracias por su colaboracion en este sitio que es de gran interes

alejo

19/5/2011
ayuda de direccionamiento de pag
para la gente que no se le direcciona a las pag de aplicacion o index es por que en el codigo de control falta escribir php al principio

<?php
//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");
}
?>

esau

02/3/2012
base de datos!
Alguien sabe como hacer este mismo ejemplo pero sacando el usuario y clave de la base de datos!

jose_luis_marcelo_chaparro_bustos

14/3/2013
error con control
hola estimados, escribi todos los codigos en las 5 paginas php, agrege al <? el php y sigo con el problema de que cuando, ingreso el usuario me muestra la pagina control.php y no hace nada mas.

alguien podria ayudarme.

graicas