• Feed RSS

Blogs Recientes

Busqueda Internet

Sunday, August 15, 2010

Registro y reconocimiento de usuarios con PHP



Registro y reconocimiento de usuarios con PHP




En esta oportunidad crearemos un sistema de registro de usuarios utilizando a PHP.


¿En que consiste? y ¿para que sirve? muy sencillo, en algunas webs como

por ejemplo esta, queremos interactuar con los usuarios, deseamos que estos

puedan enviar scripts al sistema para ayudar a crecer la coleccion de scripts

que disponemos, pero deseamos llevar un control sobre los autores de los scripts

asi que no cualquiera puede enviar scripts, para hacerlo tienes que registrarte

y hacer el respectivo "ingreso" para que el sistema te reconosca

y te deje enviar scripts, archivos y articulos como este, de otra manera no

puedes hacer ninguna de estas acciones.


¿Pero como se logra esto?, se hace teniendo en una base de datos una tabla de usuarios(Podria

hacerse con archivos, aunque seria un poco inseguro) y por medio de archivos

PHP y manejo de sesiones(session) o por "cukis"(cookies).


En este articulo explicare como crear un sistema de registro y reconocimiento de usuarios teniendo

una tabla en una base de datos MySql y por medio de "cukis"(COOKIES)

para nuestra web de una manera sencilla.


A la hora de crear un sistema de registro de usuarios siempre pensamos en lo mismo:


registro + login

+ reconocimiento


Queremos que los usuarios se registren dejando sus datos y puedan acceder a algunas zonas

de la pagina y sea reconocido por nuestra pagina(por ejemplo "bienvenido

jlmm" o "bienvenido visitante" en caso de no estar ingresado

(o registrado) en el sistema).


Muchos piensan en crear un sistema de usuarios por que les parece "bonito", pero hay

pocos que realmente lo necesitan(lo digo por experiencia con dichas personas),

y cuando les haces las dos preguntas:


1- ¿que beneficios tienen los usuarios registrados con respecto a los demas?


2- ¿que zonas de tu web quieres que sean de acceso restringido y PORQUE?


La mayoria no es capaz de responder la primera pregunta, y es que antes de aventurarnos a crear

un sistema de usuarios para nuestra web debemos de pensar si realmente vale

la pena, ya que las tematicas de la web y sus contenidos no siempre son adecuados

para tener un sistema de registro de usuarios.


Para ello respondemos las 2 preguntas, en el caso de misCODIGOS.com serian:


1- ¿que beneficios tienen los usuarios registrados con respecto a los demas?


R://Posibilidad de enviar scripts, articulos y archivos al sistema, al igual

que disponibilidad de un panel de control entre otros.


2- ¿que zonas de tu web quieres que sean de acceso restringido y PORQUE?


R://Quiero que solo los usuarios que esten registrados puedan enviar scripts/articulos/archivos,

ya que asi puedo llevar un mejor cotrol sobre los mismos y prevenir el envio

indiscriminado de scripts/articulos/archivos al sistema por parte de los usuarios.


Ya tenemos nuestras razones para crear nuestro sistema de registro de usuarios, claro que pueden

haber muchas razones dependiendo del tipo de web, podrian ser por ejemplo para

que solo usuarios registrados puedan bajar software/musica/videos/etc, para

restringir el acceso a ciertas zonas de la web "obligando" al usuario

a registrarse para poder "ver" dicha zona, etc…


Siempre teniendo en cuenta que las razones sean validas y que no molesten al usuario,

ya que en mi caso hace algunos meses me encontre con una web de "scripts"

la cual para poder ver los "scripts" tenias que registrarte, obviamente

lo que hice fue salir de esa web y olvidarla (por ello no les puedo dar la direccion),

tenemos que tener muy en cuenta que zonas restringir a usuarios registrados

ya que el usuario en general prefiere la comodidad y en este caso que les comento

de webs con recursos y scripts para webmasters hay muchas (pero ninguna como

esta :-P) y hay que buscar siempre la comodidad de los usuarios.


Ahora a lo que vinimos, crearemos nuestro sistema de registro de usuario, lo primero que debemos pensar

es que datos debera introducir el usuario para registrarse, como siempre deberan

de haber aunque sea dos campos basicos:



  • nick

  • password


Lo mas común para identificar a los usuarios es por medio de nick/password,

aunque también podria ser email/password, para este articulo utilizare

el primero(nick/password).


Ya sabemos que nuestra tabla de "usuarios" tendra esos dos campos:




CREATE TABLE usuarios (
id bigint(7) NOT NULL auto_increment,
nick char(100) NOT NULL,
password char(100) NOT NULL,
KEY id (id))


¿Pero

son suficientes?, tambien seria bueno tener el email de los usuarios en caso

de querer enviar informacion a los usuarios registrados y tener el nombre de

dichos usuarios para personalizar dichos emails o mensajes que le demos al usuario

en la pagina(ejemplo "hola jorge luis"), entonces nuestra tabla creceria

un poco:




CREATE TABLE usuarios (
id bigint(7) NOT NULL auto_increment,
nick char(100) NOT NULL,
password char(100) NOT NULL,
nombre char(255) default NULL,
email char(100) default NULL,
KEY id (id))


Listo, ya tenemos la estructura de nuestra tabla de usuarios, es pequeña y sencilla

pero para efectos prácticos y de aprendizaje es perfecta (eso depende

de ti, según lo que desees saber de tus usuarios).


Ahora viene lo sencillo,

crear el sistema de registro de usuarios, un formulario y una aplicacion que

agregue al nuevo usuario a la base de datos, para ello crearemos un formulario

del tipo:




FORM ACTION="registrar.php" METHOD="post">
Nick : <INPUT TYPE="text" NAME="nick" SIZE=20 MAXLENGTH=20>
<BR>
Email: <INPUT TYPE="text" NAME="email" SIZE=28 MAXLENGTH=100>
<BR>
Password: <INPUT TYPE="password" NAME="password"
SIZE=28 MAXLENGTH=20>
<BR>
Nombre: <INPUT TYPE="text" NAME="nombre" SIZE=28
MAXLENGTH=255>
<BR>
<INPUT TYPE="submit" CLASS="boton" VALUE="Registrar">
</FORM>


Y ahora necesitamos una aplicacion que lo procese (registrar.php), por motivos

practicos haremos algo sencillo sin demasiadas comprobaciones (dependera de

ti mejorarlo si quieres algo mas personalizado), primero el codigo luego la

explicacion:




<?php
//AQUI CONEXION O include() DE ARCHIVO DE CONEXION CON BASE DE DATOS.
function quitar($mensaje)
{
$mensaje = str_replace("<","<",$mensaje);
$mensaje = str_replace(">",">",$mensaje);
$mensaje = str_replace("'","'",$mensaje);
$mensaje = str_replace('"',""",$mensaje);
$mensaje = str_replace("","",$mensaje);
return $mensaje;
}

if(trim($HTTP_POST_VARS["nick"]) != "" && trim($HTTP_POST_VARS["email"]) != "")
{
$sql = "SELECT id FROM usuarios WHERE nick='".quitar($HTTP_POST_VARS["nick"])."'";
$result = mysql_query($sql);
if($row = mysql_fetch_array($result))
{
echo "Error, nick escogido por otro usuario";
}
else
{
$sql = "INSERT INTO usuarios (nick,password,nombre,email) VALUES (";
$sql .= "'".quitar($HTTP_POST_VARS["nick"])."'";
$sql .= ",'".quitar($HTTP_POST_VARS["password"])."'";
$sql .= ",'".quitar($HTTP_POST_VARS["nombre"])."'";
$sql .= ",'".quitar($HTTP_POST_VARS["email"])."'";
$sql .= ")";
mysql_query($sql);
echo "Registro exitoso!";
}
mysql_free_result($result);
}
else
{
echo "Debe llenar como minimo los campos de email y password";
}
mysql_close();
?>


Al principio no he echo conexion con la base de datos pero he puesto el comentario "//AQUI CONEXION O include() DE ARCHIVO DE CONEXION CON BASE DE DATOS.", ya que la conexion depende de ti, si no sabes como hacer una conexion te aconsejo

buscarte un manual antes de estar queriendo hacer un sistema como este.


Vemos que he declarado una funcion, llamada quitar($mensaje), la cual recibe el parametro "mensaje",

esta funcion se encargara de deshabilitar el codigo html("<" y

">") al reemplazarlos por su respectivo codigo("<"

y ">"), ademas de reemplazar el apostrofe(’) y las comillas dobles(")

por sus respectivos codigos HTML, esto para no tener conflictos con la instruccion

sql, y al final retorna la cadena con las nuevas modificaciones en caso de haberlas:




function quitar($mensaje)
{
$mensaje = str_replace("<","<",$mensaje);
$mensaje = str_replace(">",">",$mensaje);
$mensaje = str_replace("'","'",$mensaje);
$mensaje = str_replace('"',""",$mensaje);
$mensaje = str_replace("","",$mensaje);
return $mensaje;
}


Ahora

comprobaremos que los campos de nick y password que seran los "requeridos"

como minimo para completar el registro no esten vacios, para ello utilizamos

la funcion "trim()" la cual quita los espacios al comienzo y al final

de la cadena, por lo que en caso de ser una cadena vacia o con solo espacios

en blanco retornara "", en caso de ser valido continuamos con el registro,

de lo contrario retornamos un mensaje de error:




if(trim($HTTP_POST_VARS["nick"]) != ""
&& trim($HTTP_POST_VARS["password"]) != "")


Ahora suponiendo que las cadenas estaban correctas comprobaremos que el nick seleccionado

por el usuario no exista en la base de datos, para ello hacemos una instruccion

sql para pedirle a la base de datos que nos retorne la fila donde el nick sea

igual al nick introducido con el usuario(quitandole el apostrofe, html y demas

con la funcion quitar()):




$sql = "SELECT id FROM usuarios WHERE nick='".quitar($HTTP_POST_VARS["nick"]."'";
$result = mysql_query($sql);


En caso de existir dicho nick, osea que nos devuelve una fila:




if($row = mysql_fetch_array($result))


Mostraremos un mensaje de error al usuario informandole del "incidente", de lo

contrario continuaremos con el proceso de registro.


Ahora

lo que hacemos es simplemente una instruccion sql donde insertamos en la tabla

usuarios el nick, password, nombre y email introducidos por el usuario en el

formulario, a todos estos les quitamos el html, apostrofe y demas haciendo uso

de nuestra instruccion "quitar()", y mostramos un mensaje de "exito" al usuario:




$sql = "INSERT INTO usuarios (nick,password,nombre,email)
VALUES (";
$sql .= "'".quitar($HTTP_POST_VARS["nick"])."'";
$sql .= ",'".quitar($HTTP_POST_VARS["password"])."'";
$sql .= ",'".quitar($HTTP_POST_VARS["nombre"])."'";
$sql .= ",'".quitar($HTTP_POST_VARS["email"])."'";
$sql .= ")";
mysql_query($sql);
echo "Registro exitoso!";


Nota:Por efectos practicos hemos echo esto muy sencillo, podrian agregar más

comprobaciones como la del email o manejo de errores mysql.


Tambien podria hacerse más seguro mediante el uso de la funcion de encriptacion

md5() para el password, aunque se esta haciendo lo mas sencillo posible ya que

la finalidad de este articulo es la de enseñar como reconocer a los usuarios,

de ustedes dependen estos "detalles" a la hora de "depurar" este codigo.


Bien, listo ya tenemos la aplicacion de registro, ¿pero y ahora que?, que hago

con todos esos usuarios, ahora necesitamos que los usuarios ingresen y sean

"reconocidos" y como lo dije lo haremos por medio de cookies.


Crearemos un formulario HTML para que los usuarios introduscan su nick y password al igual que deberemos

de realizar una aplicacion ingresar.php que sera la encargada de procesar si

el usuario es valido y darle "ingreso" al sistema por medio de una

cookie.


Es recomendable tener este archivo en la carpeta raiz de nuestra web, el formulario html seria algo

asi:




<FORM ACTION="ingresar.php" METHOD="post">
Nick : <INPUT TYPE="text" NAME="nick" SIZE=20 MAXLENGTH=20>
<BR>
Password: <INPUT TYPE="password" NAME="password"
SIZE=28 MAXLENGTH=20>
<BR>
<INPUT TYPE="submit" CLASS="boton" VALUE="Ingresar">
</FORM>


Y

ahora el codigo de nuestra aplicacion ingresar.php, luego la explicacion:




<?php

//AQUI CONEXION O include() DE ARCHIVO DE CONEXION CON BASE DE DATOS.

function quitar($mensaje)
{
$mensaje = str_replace("<","<",$mensaje);
$mensaje = str_replace(">",">",$mensaje);
$mensaje = str_replace("'","'",$mensaje);
$mensaje = str_replace('"',""",$mensaje);
$mensaje = str_replace("","",$mensaje);
return $mensaje;
}

if(trim($HTTP_POST_VARS["nick"]) != "" && trim($HTTP_POST_VARS["password"]) != "")
{
$nickN = quitar($HTTP_POST_VARS["nick"]);
$passN = quitar($HTTP_POST_VARS["password"]);

$result = mysql_query("SELECT password FROM usuarios WHERE nick='$nickN'");
if($row = mysql_fetch_array($result))
{
if($row["password"] == $passN)
{
//90 dias dura la cookie
setcookie("usNick",$nickN,time()+7776000);
setcookie("usPass",$passN,time()+7776000);
?>
Ingreso exitoso, ahora sera dirigido a la pagina principal.
<SCRIPT LANGUAGE="javascript">
location.href = "index.php";
</SCRIPT>
<?
}
else
{
echo "Password incorrecto";
}
}
else
{
echo "Usuario no existente en la base de datos";
}
mysql_free_result($result);
}
else
{
echo "Debe especificar un nick y password";
}
mysql_close();
?>


Bien, arriba ya explique que debes de realizar la conexion y explique el funcionamiento

de la funcion quitar($mensaje), asi que saltemos hasta el primer "if".


Lo primero que hacemos es comprobar que los campos de "nick" y "password" para

que no esten vacios, ya sabemos para que sirve trim() asi que no lo repetire:




if(trim($HTTP_POST_VARS["nick"]) != ""
&& trim($HTTP_POST_VARS["password"]) != "")


Asi que continuamos suponiendo que todo este bien, ahora lo que hacemos es quitarle

el html, apostrofe comillas y demas al nick y password enviados por el usuario

para su comprobacion con la base de datos, para ello utilizamos la funcion quitar($mensaje)

que explicamos antes, y guardamos las nuevas cadenas en dos nuevas variables:




nickN = quitar($HTTP_POST_VARS["nick"]);
$passN = quitar($HTTP_POST_VARS["password"]);


Ahora ejecutamos una instruccion sql, en la cual le pedimos a la base de datos que

de la tabla usuarios nos devuelva la fila cuyo nick corresponda por el enviado

por el usuario:




$result = mysql_query("SELECT password FROM usuarios
WHERE nick='$nickN'");


Si devuelve una columna quiere decir que el nick SI existe en la base de datos,

de lo contrario devolvemos un mensaje de error:




if($row = mysql_fetch_array($result))
{
...
}
else
{
echo "Usuario no existente en la base de datos";
}


Ahora continuamos con el proceso suponiendo que el usuario exista en la base de datos

ahora debemos comprobar que el password sea correcto, para ello hacemos una

simple comparacion, si es correcto continuamos de lo contrario mostramos el

mensaje de password incorrecto:




if($row["password"] == $passN)
{
...
}
else
{
echo "Password incorrecto";
}


Ahora suponiendo que el password es correcto continuamos y lo proximo a hacer es establecer

las cookies de nick y password (Las cuales nombramos "usNick"/"usPass" y contienen el nick y password respectivamente) en la maquina del usuario, informamos

que se ha realizado correctamente el login y lo enviamos a la pagina principal,

una vez mas recalco que estamos haciendo esto lo mas sencillo posible, de ti

depende personalizar y mejorar los mensajes :




setcookie("usNick",$nickN,time()+7776000);
setcookie("usPass",$passN,time()+7776000);
?>
<SCRIPT LANGUAGE="javascript">
alert("Ingreso exitoso");
location.href = "index.php";
</SCRIPT>
<?


Listo, el usuario ya tiene las cookies en su sistema, ¿pero ahora que?, como

hacemos para comprobar en las paginas que queramos si el login es correcto,

osea que el usuario posee las cookies y son validas?.


Para ello crearemos un ultimo archivo, lo llamaremos login.php, este se encargara de leer las cookies

y decirnos si el usuario es un usuario registrado y que ha echo el respectivo "ingreso" al sistema, el contenido de dicho archivo seria el siguiente:




<?php
$loginCorrecto = false;
$idUsuarioL;
$nickUsuarioL;
$emailUsuarioL;
$nombreUsuarioL;

if(isset($HTTP_COOKIE_VARS["usNick"]) && isset($HTTP_COOKIE_VARS["usPass"]))
{
$result = mysql_query("SELECT * FROM usuarios WHERE nick='".$HTTP_COOKIE_VARS["usNick"]."' AND password='".$HTTP_COOKIE_VARS["usPass"]."'");

if($row = mysql_fetch_array($result))
{
setcookie("usNick",$HTTP_COOKIE_VARS["usNick"],time()+7776000);
setcookie("usPass",$HTTP_COOKIE_VARS["usPass"],time()+7776000);
$loginCorrecto = true;
$idUsuarioL = $row["id"];
$nickUsuarioL = $row["nick"];
$emailUsuarioL = $row["email"];
$nombreUsuarioL = $row["nombre"];
}
else
{
//Destruimos las cookies.
setcookie("usNick","x",time()-3600);
setcookie("usPass","x",time()-3600);
}
mysql_free_result($result);
}
?>


Lo primero que hacemos es declarar unas variables que utilizaremos para guardar

los datos del usuario en caso de tener las cookies en su sistema y de estas

ser correctas:




$loginCorrecto = false;
$idUsuarioL;
$nickUsuarioL;
$emailUsuarioL;
$nombreUsuarioL;


Hay una variable boleana que tenemos que mirar de cerca y es la de $loginCorrecto

ya que esta sera la que utilizaremos para comprobar el login en nuestros archivos,

mas adelante veremos como.


Seguidamente lo que hacemos es comprobar que las cookies existan, si no existen pues no hay problema

simplemente no hay "ingreso" :




if(isset($HTTP_COOKIE_VARS["usNick"]) &&
isset($HTTP_COOKIE_VARS["usPass"]))


Ahora lo que hacemos es una sentencia sql, en la cual le pedimos a la base de datos

que nos devuelva la fila donde el nick y password correspondan al nick y password

guardado en las cookies:




$result = mysql_query("SELECT * FROM usuarios WHERE
nick='".$HTTP_COOKIE_VARS["usNick"]."' AND password='".$HTTP_COOKIE_VARS["usPass"]."'");


Si ese nick y password corresponden a una fila en la base de datos esto quiere

decir que son correctos de lo contrario la informacion de las cookies esta mal

y debemos destruirlas:




if($row = mysql_fetch_array($result))
{
...
}
else
{
//Destruimos las cookies.
setcookie("usNick","x",time()-3600);
setcookie("usPass","x",time()-3600);
}


Si la informacion es correcta procedemos con el ingreso, establecemos de nuevo

las cookies con lo que se actualiza el tiempo de destruccion a otros noventa

dias apartir de ahora:




setcookie("usNick",$HTTP_COOKIE_VARS["usNick"],time()+7776000);
setcookie("usPass",$HTTP_COOKIE_VARS["usPass"],time()+7776000);


Seguido de esto establecemos la variable $loginCorrecto a "true", y las otras

variables las llenamos con la informacion del usuario:




$loginCorrecto = true;
$idUsuarioL = $row["id"];
$nickUsuarioL = $row["nick"];
$emailUsuarioL = $row["email"];
$nombreUsuarioL = $row["nombre"];


Listo ya tenemos nuestro archivo "login.php", ahora ¿como lo utilizamos?,

bien supongamos que queremos en nuestro "index.php" darle la bienvenida

al usuario en caso de estar ingresado en el sistema deseamos saludarlo por su

nick o nombre en caso contrario lo saludaremos como visitante, para ello tendriamos

que incluir el archivo "login.php" al comienzo de nuestro archivo

"index.php" asi:


Nota:Antes de incluir el "login.php" debe recordar realizar la conexion con la base de datos,

de lo contrario obtendra errores.




<?php
//AQUI CONEXION O include() DE ARCHIVO DE CONEXION CON BASE DE DATOS.
include("login.php");
...


Con eso el "login.php" se encargara de realizar las acciones que vimos

arriba, ahora en nuestro "index.php" donde queramos saludar al visitante

ponemos lo siguiente:




... if($loginCorrecto)
{
echo "Estas identificado en el sistema como ".$nickUsuarioL;
}
else
{
echo "Bienvenido visitante, el sistema no te ha reconocido";
}
...


Como ven, hicimos uso de la variable $loginCorrecto la cual sera "true"

en caso de que el usuario fuera reconocido por el sistema, de lo contrario sera

"false".


Y asi podemos usarlo en muchas areas, supongamos que tenemos una seccion donde solo pueden accesar

los usuarios registrados, la llamaremos "restringida.php", entonces lo que hariamos para prevenir que usuarios no registrados vean el contenido seria algo asi:




<?php
//AQUI CONEXION O include() DE ARCHIVO DE CONEXION CON BASE DE DATOS.

include("login.php");

if($loginCorrecto)
{
echo "Aqui el contenido solo para usuarios registrados";
}
else
{
echo "El sistema no lo ha identificado, solo los usuarios registrados tienen acceso a esta area";
}
?>


Eso es todo, espero haya quedado claro. PD: Sobre el proceso de "logout"

o "salir" no lo explico ya que es algo muy sencillo, simplemente se

"borran" las cookies.


No comments: