<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> if(document.getElementById('clave').value == document.getElementById('clave2').value) <body> <?php require('conexion.php'); if(isset($_POST['usuario']) && isset($_POST['clave'])) $usuario = $_POST['usuario']; mysql_query("insert into usuario values('','".$usuario."','".$sha1_clave."')"); } $usuario = "error"; } ?> <body> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <body> <?php require('conexion.php'); /////////////////////////////////////////////////////////////////////////////////////////// if (isset($_POST['clave']) && isset($_POST['usuario'])) echo $usu[0]; <?php //Inicio la sesión //Verifico si es un usuario autenticado //si no existe, envio a la página de autentificacion <?php //Incluyo el archivo de sesion para impedir el acceso no autorizado a esta página. ?> <body> <?php //si no existe, envio a la página de autentificacion ?>
La Autenticación consiste en verificar la identidad del usuario que esta entrando a una aplicación, con el fin de personalizar el ambiente a su gusto, habilitarle o deshabilitarle recursos u opciones, guardar historial, etc.
En este ejemplo vamos a explicar una manera simple pero bastante segura de autenticar usuarios en una pagina web con PHP, utilizando conceptos como sesiones, funciones hash, método post, etc.
Para empezar debemos entender como funcionará el mecanismo de autenticación, lo dividiremos en dos etapas, registro y autenticación, siendo el "registro" la primera vez que el usuario entra al sistema y crea una cuenta de usuario proporcionando un nombre de usuario y una clave, la etapa de "autenticacion" es cuando en futuras ocaciones el usuario desee ingresar en su cuenta creada en la etapa de registro y deba autenticarse para poder entrar.
Pasos para el Registro del usuario:
Pasos para la autenticacion del usuario:
Antes del tutorial, les quiero dejar los videos del ejemplo que vamos a realizar, para los que les queden dudas:
Parte 1
Parte 2
Para empezar el ejemplo lo primero que vamos a hacer es crear una base de datos llamada "usuariosDB" donde vamos a crear la tabla "usuario" con las columnas "usuario", "clave" y un "id" que identificara internamente ese usuario en la BD.
Código de creacion de la tabla usuario--
-- Estructura de tabla para la tabla `usuario`
--
CREATE TABLE `usuario` (
`id` bigint(20) NOT NULL auto_increment,
`usuario` varchar(15) NOT NULL,
`clave` varchar(205) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `usuario` (`usuario`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Ahora procedemos a crear una página "registro.php" donde el usuario deberá introducir el nombre de usuario y contraseña que desea utilizar de ahora en adelante:
Código registro.php
Para enviar la clave introducida por el usuario primero llamamos a la funcion javascript "ec()" creada en la cabecera que se encarga de verificar que las dos claves introducidas sean iguales y ademas se encarga de aplicar la funcion str_sha1() (que se encuentra en el archivo "sha1.js" que importamos en la cabecera de la página) para transformar la clave introducida en un codigo Hash que sea casi imposible de descrifrar para cualquier persona (incluso nosotros).
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Login - Ejemplo de autentiacion</title>
<style type="text/css">
<!--
.style1 {
font-size: 36px;
font-weight: bold;
}
-->
</style>
<script type="text/javascript" language="JavaScript1.2" src="sha1.js"></script>
<script language="JavaScript">
function ec()
{
{
document.getElementById('clave').value = str_sha1(document.getElementById('clave').value);
document.getElementById('clave2').value = "";
return true;
}
else
{
alert('Las claves no coinciden');
return false;
}
}
</script>
</head>
<table width="74%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td><p> </p>
<p class="style1">Registro de usuario con Hash Sha-1</p>
<p>La clave que el usuario introduzca en el el campo "clave" del formulario será transformada con el algoritmo Sha-1 y luego será enviada al servidor.</p></td>
</tr>
<tr>
<td height="277" align="center" valign="top"><p align="left"><br />
</p>
<p align="center"></p>
<form id="form1" name="form1" method="post" action="registrado.php">
<p><strong>Introduce tu usuario y clave que desees</strong></p>
<p>Usuario:
<input type="text" name="usuario" id="usuario" />
</p>
<p>Clave:
<input type="password" name="clave" id="clave" />
</p>
<p>Repite la clave:
<input type="password" name="clave2" id="clave2" />
</p>
<p>si ya tienes cuenta haz <a href="login.php">click aqui</a></p>
<p>
<input name="button" type="submit" id="button" onclick="return ec();" value="Registrarme"/>
</p>
</form> <p align="center"> </p></td>
</tr>
<tr>
<td height="19" align="center" valign="bottom">Alejandro Sánchez - http://internetdeveloping.blogspot.com/</td>
</tr>
</table>
</body>
</html>
Los datos del fomulario son enviados a la pagina "registrado.php" el código de esta página es el siguiente:
Código registrado.php
En esta página nos encargamos de almacenar en la base de datos el nuevo usuario con el hash de su clave. Ahora que ya tenemos un usuario registrado debemos proceder a la segunda fase, y crear las paginas necesarias para que el usuario se autentique en futuras ocaciones y pueda ingresar a las secciones privadas de su cuenta.
{
$sha1_clave = $_POST['clave'];
else
{
$sha1_clave = "error";
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Login - Ejemplo de autentiacion</title>
<style type="text/css">
<!--
.style1 { font-size: 36px;
font-weight: bold;
}
-->
</style>
</head>
<table width="74%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td><p> </p>
<p class="style1">Usuario registrado</p></td>
</tr>
<tr>
<td height="277" align="center" valign="top"><p align="left"><br />
</p>
<p align="left"></p>
<form id="form1" name="form1" method="post" action="">
<p><strong>El usuario ha sido correctamente registrado.</strong></p>
</form>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="30%"><div align="right">Nombre de usuario:</div></td>
<td width="70%"><div align="center"><?php echo $usuario ?></div></td>
</tr>
<tr>
<td><div align="right">Clave:</div></td>
<td><div align="center"><?php echo $sha1_clave ?></div></td>
</tr>
</table>
<p align="center">Para acceder a tu cuenta haz <a href="login.php">click aqui</a></p></td>
</tr>
<tr>
<td height="19" align="center" valign="bottom">Alejandro Sánchez - http://internetdeveloping.blogspot.com/</td>
</tr>
</table>
</body>
</html>
Procedemos a crear la pagina "login.php":
Código login.php
En esta página recogemos el nombre de usuario y contraseña escritos por el usuario y aplicamos laf uncion str_sha1() a la clave del usuario para enviarla a la página autenticacion.php, el código de esta últimap página es el siguiente:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Login - Ejemplo de autentiacion</title>
<style type="text/css">
<!--
.style1 {
font-size: 36px;
font-weight: bold;
}
-->
</style>
<script type="text/javascript" language="JavaScript1.2" src="sha1.js"></script>
<script language="JavaScript">
function ec()
{
document.getElementById('clave').value = str_sha1(document.getElementById('clave').value);
}
</script>
</head>
<table width="74%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td><p> </p>
<p class="style1">Autenticacion con Hash Sha-1</p>
<p>La clave que el usuario introduzca en el el campo "clave" del formulario será transformada con el algoritmo Sha-1 y luego será enviada al servidor.</p></td>
</tr>
<tr>
<td height="277" align="center" valign="top"><p align="left"><br />
</p>
<p align="center"></p>
<form id="form1" name="form1" method="post" action="autenticacion.php" onsubmit="ec()">
<p><strong>Introduce los datos de tu cuenta</strong></p>
<p>Usuario:
<input type="text" name="usuario" id="usuario" />
</p>
<p>Clave:
<input type="password" name="clave" id="clave" />
</p>
<p>si no tienes cuenta haz <a href="registro.php">click aqui</a></p>
<p>
<input type="submit" name="button" id="button" value="Enviar" />
</p>
</form> <p align="center"> </p></td>
</tr>
<tr>
<td height="19" align="center" valign="bottom">Alejandro Sánchez - http://internetdeveloping.blogspot.com/</td>
</tr>
</table>
</body>
</html>
Código autenticacion.php
En esta página recibimos el nombre de usuario y el hash de la clave introducida por el usuario en el momento de realizar su autenticacion, debemos ahora verificar que el nombre de usuario existe, y, si realmente existe, entonces debemos verificar si el usuario existente tiene la misma clave que la proporcionada.
//Inicio la sesión
session_start();
//Si esta entrando en una seccion que no le corresponde
$_SESSION["usuario"]="anonimo";
$_SESSION["valido"]=0;
{
//evito que haya colocado mas de una palabra en el login (para evitar sql injection)
$usu = split(" ",trim($_POST['usuario']));
//Guardo la identidad del cliente que desea autenticarse
$_SESSION["usuario"]= $usu[0];
$result = mysql_query("select clave from usuario where usuario='".$_SESSION["usuario"]."'");
//Si encontre el usuario en la bd
if(mysql_num_rows($result)==1)
{
$row = mysql_fetch_row($result);
//Si los hash de la clave coinciden
if($_POST['clave']==$row[0])
$_SESSION["valido"]=1;
echo $row[0] , ' = ' . $_POST['clave'];
}
}
//si no existe, envio a la página de autentificacion
header("Location: miCuenta.php");
//ademas salgo de este script
exit();
?>
Si las claves coinciden entonces creamos una variable de sesion llamada $_SESSION["valido"] y la igualamos a 1 para decir que es un usuario valido, de no existir un usuario con ese nombre o de no coincidir la clave de la bd con la clave proporcionada por el usuario, entonces asignamos el valor de 0 a la variable $_SESSION["valido"].
Esta variable de sesion será la llave para establecer los permisos, si el usuario desea entrar a una página privada, pero la variable $_SESSION["valido"] no existe o es diferente de 1, entonces no podrá acceder a esa página, de lo contrario todo ocurrirá normalmente.
Para lograr esa funcionalidad debemos crear un archivo llamado sesion.php donde vamos a verificar que esa variable este igual a 1, de lo contrario la pagina te redireccionará a la pagina ya creada login.php. La pagina sesion.php deberá ser incluida al principio de cada página que queramos catalogar como "privada". El codigo de sesion.php es el siguiente:
Código sesion.php
session_start();
if ($_SESSION["valido"]!=1)
{//quiere decir que tiene prohibida la entrada a cualquier lugar privado
header("Location: login.php");
//ademas salgo de este script
exit();
}
?>
Por ultimo creamos la página privada "miCuenta.php" y la pagina "cerrar_sesion.php". La primera de ellas contendrá una llamada a la pagina sesion.php para garantizar su privacidad. mientras que la otra permitira cerrar la sesion autentificada y volver a iniciar el ciclo de autenticación.
Código micuenta.php
Código cerrar_sesion.php
require('sesion.php');
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Login - Ejemplo de autentiacion</title>
<style type="text/css">
<!--
.style1 { font-size: 36px;
font-weight: bold;
}
-->
</style>
</head>
<table width="74%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td><p> </p>
<p class="style1">Autenticacion Básica</p></td>
</tr>
<tr>
<td height="277" align="center" valign="top"><p align="left"><br />
</p>
<p align="left"></p>
<form id="form1" name="form1" method="post" action="">
<p><strong>Si ves esta pagina, tu sesion ha sido validada y puedes navegar por la zona privada.</strong></p>
<p>haz <a href="cerrar_sesion.php">click aqui</a> para cerrar tu sesion</p>
</form>
<p align="center"> </p></td>
</tr>
<tr>
<td height="19" align="center" valign="bottom">Alejandro Sánchez - http://internetdeveloping.blogspot.com/</td>
</tr>
</table>
</body>
</html>
Cualquier comentario o duda no dudes en escribirlo abajo o enviarme un mail a aalejo+blog@gmail.com.
session_start();
session_destroy();
header("Location: miCuenta.php");
//ademas salgo de este script
exit();
sábado, 15 de noviembre de 2008
Autenticacion (Autentificacion) de usuario con PHP y Hash Sha-1
Suscribirse a:
Enviar comentarios (Atom)
hermanazo! muy bueno tu programa.
ResponderEliminarSoy practicamente nuevo en esto de php-mysql. Podrias tu ayudarme o explicarme algo?
veo que en el código utilizas la variable de tipo $_POST para pasar las variables, mi pregunta es:
tengo instalado PHP5 y uno de los primeros programas/aplicacion que consegui fue la de introducir datos de email y nombre de usuario a traves de un formulario, pero el mismo tambien estaba hecho con $HTTP_POST_VARS, resulta que despues de leer e investigar, y para resumirte la cambie a $_POST y aun asi no me trabajaba, cuando por fin la cambie a $_GET la aplicacion me trabaja sin problemas.
La aplicacion esta 100% bien explicada, pero me funciona hasta creo la mitad :S ! no ingresan en mi base de datos los valores usuario y password,
Me pregunto si sea por el mismo caso de que utilizas $_POST.
Tendras idea de porque sucede esto ?
Esperando me puedas ayudar !
Muchas gracias!
Francisco
A ver si te entiendo, tienes instalado PHP5 con un servidor Apache..no? Ademas ya has probado que las paginas en PHP funcionan correctamente, pero el problema esta a la hora de insertar en la base de datos MySQL.. no??
ResponderEliminarImplementar este ejemplo con el metogo GET requiere que cambies en la etiqueta 'form' el parametro action="get" por action="post" como las variables &_POST[''] a $_GET[''] que reciben los datos del formulario en la página siguiente.
Pero no deberia haber ninguna diferencia entre ambos metodos, si no se esta realizando la insercion en la BD debe ser un error en la Tabla, prueba creando tu mismo una tabla llamada "usuario" a través de phpMyAdmin con los siguientes atributos:
id: de timpo bigint(20) y le marcas auto_increment
usuario: de tipo varchar(15)
clave: de tipo varchar(205)
Luego marca como clave el atributo 'id'.
Verifica el codigo del "insert" a la base de datos ehcho en la pagina 'registrado.php' del ejemplo. Si quieres enviame a mi correo tu codigo a ver si te puedo ayudar mejor.
Alejandro muy buenos programas de verdad viene muy bien explicado yo soy novato en esto del php y mysql pero la verdad no eh encontrado mejor tutorial explicado salvo x un detallito que te falto fue el script de la conexion.php pero bueno ese viene en los archivos de descarga
ResponderEliminarte agradezco ya que me sirvio bastante
muchisimas gracias.
Luis Vazquez
Uf no sabia que existia tal material :D voy a devorarlo todo, gracias amigo por subirlo, y por apoyar el autoaprendizaje ;)
ResponderEliminarEste pedaso de codigo:
ResponderEliminar$usu = split(" ",trim($_POST['usuario']));
echo $usu[0];
//Guardo la identidad del cliente que desea autenticarse
$_SESSION["usuario"]= $usu[0];
No lo entiendo muy bien, ademas me di cuenta del siguite error: cree un user (moises) con su passw(123) pero al momento de logearme y coloco "moises"+" "+"cualkier cosa" este se logea sin problemas como si "moises"+" "+"cualkier cosa" fuese igual a "moises", si no toy mal, y em disculparas pues soy un novato en esto, creo q es por algo referente a este pedaso de codigo no? bueno ahi ta mi inquietud, gracias...
Muy bueno, pero ahora surge u inconveniente mas, y lo hagamos mas comlejo, deseo incluirle un nivle de acceso, por ejemplo un usuario qu entre a una determinada pagina y otro a otra...
ResponderEliminarhola me llamo Alicia, he hecho todo tal y como lo explicas, pero he debido hacer algo mal. Si puedes entrar en www.paellakits.com y ver que puede pasar... tengo ahi todos los archivos. Sale un error al iniciar sesion, pero no se a donde asociarlo.
ResponderEliminarSaludos
este es mi correo, tunikiya@gmail.com
Graciassss
muchisimas gracias, ojala supiera la mitad de lo que tu sabes...gracias gracias gracias
ResponderEliminarBuenas noches, estaba implementando tu codigo pero al momento de cerrar sesion me aparece
ResponderEliminar"
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\AppServ\www\aut\cerrar_sesion.php:1) in C:\AppServ\www\aut\cerrar_sesion.php on line 8"
ya elimine todos los espacios pero aun sigue la falla, agradezco tu colaboracion
hola tengo el mismo problema q jhosman mora, q se puede hacer
ResponderEliminarHola que tal muy buena explicacion de tu codigo me parece interesante, pero surge un error al momento de ingresar.
ResponderEliminarHASTA ACA BIEN PORQUE ME REGISTRO Y SE GUARDA EN LA BD TODA LA INFORMACION INTRODUCIDA, PERO CUANDO QUIERO INICIAR SESION ME DICE:
***********************************************
* Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /home/clikearp/public_html/usuarios/conexion.php:2) in /home/clikearp/public_html/usuarios/autenticacion.php on line 5
* Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/clikearp/public_html/usuarios/conexion.php:2) in /home/clikearp/public_html/usuarios/autenticacion.php on line 5
miguel75004f149038473757da0be07ef76dd4a9bdbc8d = 75004f149038473757da0be07ef76dd4a9bdbc8d
Warning: Cannot modify header information - headers already sent by (output started at /home/clikearp/public_html/usuarios/conexion.php:2) in /home/clikearp/public_html/usuarios/autenticacion.php on line 40
**********
ME DA ERROR EN EL ARCHIVO AUTENTIFICACION.PHP
Saludos a todos, y en especial a nuestro amigo Alejandro Sanchez, quien comparte sus conocimientos con todos nosotros, a mi también me sucedio lo mismo que a ustedes es decir a los lectores de estos tutoriales, bueno les comento mi solución al problema generado, para los que tienen problemas en el cierre de sesión tienen que editar el PHP.INI y buscar la linea output_buffering y ponerla en estado de On, vale aclarar que deben reiniciar el servidor (en mi caso tengo apache) sino no funcionara. y para los que tienen el problema en autenticación.php lo que deben hacer es colocarle un // delante de las lineas que comienzan con echo, eso es para que header pueda correr sin problemas... espero haber ayudado a esta comunidad de seguidores, y agradecer enormemente a Alejandro Sanchez.
ResponderEliminarbuenisimoo
ResponderEliminarlo que andaba buscando hace tiempo,,,
solo tengo una inquietud,,, como implemento el código a mi pagina web???
la verdad soy novato en esto y me gustaría un poco de ayuda extra
mi correo es albeiro33@hotmail.com
te agradecería mucho tu ayuda,,, Dios te bendiga
Exitos
hola alejandro sanchez, soy luis sanchez casi tu primo XD
ResponderEliminarweno broer tengo todo listo el codigo pero a la hora de iniciar la sesion me sale error en autentificacion.php
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\AppServ\www\autenticacion\conexion.php:2) in C:\AppServ\www\autenticacion\autenticacion.php on line 5
luiscc61a0f386a2877e3e27587fa086d2945b97c811 = cc61a0f386a2877e3e27587fa086d2945b97c811
ayudame porfavor, necesito saber como iniciar una sesino ^^ DTB!!
muchisimas gracias amigo me sirvio no tuve ningun problema al implementarlo de nuevo gracias por tus conocimientos y por tu tiempo
ResponderEliminarMuy buenas
ResponderEliminarte felicito por tu aporte; esta muy bueno
tengo una duda; donde iguala lo ingresado con lo que esta en la base de datos? me perdi con lo del algoritmo hash. si fueras tan amable
Muchas gracias
Que tal Alejandro, muy buen material de tu blog, con respecto a la auteticacion con sha_1. he podido ingresar los usuarios con su datos excepto por que cualquier usuario que le ponga por clave "lamisma" no lo registra en mysql en cambio si pongo por clave "lamism" esa si la registra se me hace raro podrías ayudarme con esta duda.
ResponderEliminarya lo resolví, en el vídeo llamas a la instrucción del archivo registro.php donde haces la conversión así:
ResponderEliminardocument.getElementById('clave').value = str_sha1(document.getElementById('clave').value);
y en el archivo que descargue del ejemplo viene así
document.getElementById('clave').value = hex_sha1(document.getElementById('clave').value);
la diferencia es str_sha1 y hex_sha1 porque el cambio?
eL CODIGO NO SIRVE!! y nadie resuelve el problema... que perdida de tiempo!
ResponderEliminarcomprobado tiene razon Moises:
ResponderEliminarmoises dijo...
Este pedaso de codigo:
$usu = split(" ",trim($_POST['usuario']));
echo $usu[0];
//Guardo la identidad del cliente que desea autenticarse
$_SESSION["usuario"]= $usu[0];
No lo entiendo muy bien, ademas me di cuenta del siguite error: cree un user (moises) con su passw(123) pero al momento de logearme y coloco "moises"+" "+"cualkier cosa" este se logea sin problemas como si "moises"+" "+"cualkier cosa" fuese igual a "moises".
Alejandro cuando revisaras los post??
ya viste las fehcas???
cuando contestaras??
invertiste demasiado tiempo en este proyecto como para dejarlo abandonado.
arregla el codigo!
18 de Diciembre de 2010
Buenas desde España...
ResponderEliminarAntes de nada, la enhorabuena por el tutorial.
Me pasó lo mismo con el código de autentificación, todo conecta bien a la bd pero despues al hacer login me sale esto--->
Warning: Cannot modify header information - headers already sent by (output started at /home/ital10/domains/jesuscardiel.com/public_html/login/autenticacion.php:19) in /home/ital10/domains/jesuscardiel.com/public_html/login/autenticacion.php on line 40
Habría alguna posibilidad de solucionarlo?
Gracias de antemano, puedes contactar conmigo escribiendo a: jescarmar@hotmail.com
donde consigo el sha.js mil gracias muy bueno tu aporte a lo novatos como yo
ResponderEliminardonde consigo el sha.js mil gracias muy bueno tu aporte a lo novatos como yo contacto@julianrivillas.com mil gracias
ResponderEliminary como se hacen las autentificaciones en caso de tener varios perfiles de usuarios, y que cada uno tenga un menu diferente :)
ResponderEliminarHola. Te cuento que por mi parte está todo funcional, pero... siempre hay un pero... ja ja ja... bueno sabes cual es... Es que al cerrar el navegador sigue abierta la sesión... solo me basta copiar la dirección y pegarla en otra pestaña del navegador y listo estoy de nuevo autenticado.
ResponderEliminarQuisiera que implementes el código para CERRAR SESIÓN AL CERRAR EL NAVEGADOR Y NO SOLO CON EL LINK QUE PONES PARA CERRAR SESIÓN. Te lo agradecería bastante.
Hasta la próxima y te agradezco por tu aporte que está buenísimo.
Bye bye