Sunteți pe pagina 1din 7

Seguridad en el registro de usuarios y el manejo de sesiones con PHP (primera parte)

En la actualidad la seguridad es uno de los aspectos ms relevantes del desarrollo de sistemas, sobre todo en ambiente web, miles de personas por hora pueden visitar tu sitio dependiendo de su popularidad, y todas ellas pueden tener acceso a informacin que quizs tu no quieras compartir. Est claro que si tienes informacin de carcter confidencial no es buena idea mantenerla en el mismo servidor web que el de tu aplicacin, pero si se trata de alguna informacin que debemos compartir con nuestros usuarios pero de forma limitada debemos tomar medidas. Existen muchas personas que se plantean y preguntan si realmente es necesaria la seguridad en un sitio web , muchos de nosotros en algunos casos tomamos este aspecto como algo irrelevante, y lo dejamos a lo ltimo, o incluso no lo tomamos en cuenta. Es claro que no todos los datos son blancos de proteccin, la seguridad es algo que se debe aplicar a la medida, para la informacin que lo amerite y de la forma adecuada, no es necesario invertir una gran cantidad de horas frente al monitor planeando y codificando formas de proteger nuestro sitio, simplemente basta con saber que informacin proteger y de qu forma, y que mejor que esto sea automatizado.

Seguridad para aplicaciones web con PHP


PHP tiende a ser un lenguaje donde la seguridad no es muy tocada por sus desarrolladores, esto se debe en gran medida a la novatez de muchos de ellos, puesto que PHP es uno de sus primeros lenguajes y decidieron aprenderlo precisamente por su sencillez y facilidad. En la actualidad si manejamos un framework de PHP la seguridad es casi un aspecto implcito, pero muchos de nosotros no empezamos directamente desarrollando en un framework, de hecho esto no es recomendable, nuestras primeras aplicaciones por lo general cuentan con cdigo embebido y con conexiones a bases de datos hechas sin algn tipo de encapsulamiento.

Manejo de sesiones en PHP


Para ayudar a proteger esta informacin que desplegamos, o para restringir el uso de alguno de nuestros sistemas de insercin o eliminacin de datos, podemos utilizar lo que se conoce como manejo de sesiones, que en PHP resulta ser una tarea bastante sencilla de realizar.

Aclaro que este tutorial es para principiantes en PHP, si te interesan aspectos ms avanzados tratar de escribir algo en un futuro pero por el momento esto es para iniciar en el mundo de las sesiones a todos aquellos que deseen aplicarlas en su sitio. Como requisitos previos para realizar lo que a continuacin explicare, debemos tener Apache, PHP5 y MySQL instalados en nuestro servidor o computadora personal, en caso de que no desees instalarlos y configurarlos por separado puedes recurrir a XAMPP o WAMP en el caso de que ests trabajando con Windows, a MAMP en el caso de MAC o a la paquetera LAMP si estas en Linux, aunque si ya ests con Linux te recomendara ms hacer la instalacin con apt-get install de cada elemento por separado.

Creamos la base de datos


El primer paso de siempre es crear nuestra base de datos donde guardaremos los usuarios. Cuando estamos trabajando con MySQL de manera local generalmente el host de nuestra aplicacin es localhost, el usuario y la contrasea variar segn la configuracin que dimos al instalar MySQL. Para manejar las Bases de datos podemos utilizar administradores como phpMyAdmin (incluido en XAMPP), Navicat, MySQL query browser o manejarlo desde consola.

Creamos la tabla para los usuarios


Una vez creada la base de datos (CREATE DATABASE mipagina) debemos crear una tabla dentro de ella llamada usuarios, aunque algunos manejan otros nombres no relacionados con sesiones para distraer o engaar, lo anterior sera de la siguiente manera:
USE mipagina; CREATE TABLE usuarios ( ID INT(25) NOT NULL AUTO_INCREMENT PRIMARY KEY , Nombre VARCHAR(65) NOT NULL , Password VARCHAR(32) NOT NULL , Email VARCHAR(255) NOT NULL );

Este primer cdigo bsicamente lo que hace es escoger la base de datos mipagina donde crearemos la tabla usuarios que tendr 4 campos, el primero llamo ID que ser un nmero entero de longitud 25, que no puede ser nulo, se autoincrementar (es decir cada vez que se cree un registro nuevo se le aumentar 1 nmero) y es la clave primaria, lo cual indica que es el campo que identificara como diferente al resto y servir en caso de que queramos relacionarlo con otras tablas como Foreign key, el campo nombre, password y email son prcticamente lo mismo variando nicamente la longitud.

Creamos el archivo de conexin a la DB


Una vez creada la tabla debemos crear nuestro primer archivo PHP, el cual se utilizar cada vez que queramos hacer una conexin a la base de datos, para no tener que estar repitiendo el mismo pedazo de cdigo una y otra vez lo guardamos en un archivo PHP y lo incluimos mediante include en el cdigo de la pgina.

Nombraremos al archivo db.php y contendr lo siguiente:


<?php session_start(); /* Inicia la sesin, funcin utilizada para mantener la sesin y variables de sesin para que no se pierdan sus valores al navegar a travs de las pginas del sitio */ $host = "localhost"; // normalmente es localhost pero puede variar $nombre = "mipagina"; //nombre de la base de datos que estas usando para el proyecto $usuario = "root"; // nombre del usuario con el que te conectas a esa base de datos $password = "qwerty"; // la password de dicho usuario mysql_connect($host, $usuario, $password) or die("MySQL Error: " . mysql_error()); /* Conecta con la base de datos utilizando los atributos dados, en caso de falla imprimir un error en nuestro navegador */ mysql_select_db($nombre) or die("MySQL Error: " . mysql_error()); /* Selecciona la base de datos */ ?>

Integramos el PHP de conexin con el HTML


Ya creado nuestro archivo de conexin a la base de datos debemos incluir en nuestro index.php o en la pgina donde queramos hacer la conexin, esto se logra mediante el siguiente cdigo:
<?php include "bd.php"; ?>

Creamos nuestra pgina de inicio con el cdigo HTML:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Sesiones</title> </head> <body> <div id="principal"> </div> </body> </html>

Ahora dentro de nuestro div principal debemos incluir el cdigo PHP que vamos a desarrollar para determinar qu mostrar. Si el usuario ya inici sesin vamos a mostrar su nombre, si no ha iniciado entonces mostraremos un form con dos campos para que ingrese su usuario y su contrasea y claro la opcin para Registrarse en caso de que no cuente con una clave todava.
<?php if(!empty($_SESSION['inicio']) && !empty($_SESSION['usuario'])) { // Mostrar el mensaje con su nombre } elseif(!empty($_POST['usuario']) && !empty($_POST['password'])) {

// Realizar el proceso para que el usuario inicie sesin } else { // Mostrar el form para ingresar y la opcin para registrarse } ?>

En la segunda parte de este tutorial veremos algunos detalles ms sobre la seguridad en el registro de usuarios y el manejo de sesiones PHP.

Seguridad en el registro de usuarios y el manejo de sesiones con PHP (segunda parte)


Completamos la primera parte del tutorial sobre la seguridad en el registro de usuarios y el manejo de sesiones en PHP. Cuando un usuario inicia sesin, la informacin incluida en sta se guarda en variables globales a las cuales se puede acceder con el prefijo $_SESSION, dentro de los If de nuestro cdigo utilizamos la funcin empty de PHP con el operador ! al inicio indicando lo que se podra interpretar de la siguiente manera si la variable de sesin inicio y la variable de sesin usuario no estn vacas prosigue mostrando el mensaje con su nombre y email. La primera parte quedara de la siguiente manera:
if(!empty($_SESSION['inicio']) && !empty($_SESSION['usuario'])) { // Mostrar el mensaje con su nombre > <h1>Mensaje</h1> <p>Hola <?=$_SESSION[usuario] ; ?> Cmo ests?</p> <? }

En el segundo IF, estamos realizando bsicamente lo mismo solo que con las variables que nos llegan con el mtodo POST del formulario, en el caso de que estas sean las que no estn vacas debemos iniciar el proceso para crear la sesin.
elseif(!empty($_POST['usuario']) && !empty($_POST['password'])) { $usuario = mysql_real_escape_string($_POST['usuario']); $password = md5(mysql_real_escape_string($_POST['password'])); $verifica = mysql_query("SELECT * FROM usuarios WHERE usuario = '". $usuario."' AND password = '".$password."'");

if(@mysql_num_rows($verifica) == 1) { $row = @mysql_fetch_array($verifica); $email = $row['email']; $_SESSION['usuario'] = $usuario; $_SESSION['email'] = $email; $_SESSION['inicio'] = 1; echo "<meta http-equiv='refresh' content='=1;index.php' />"; } else { echo Error, usuario y/o contrasea incorrectos; }

Lo que hacemos en esta parte es agregarle los valores enviados mediante POST a las variables $usuario y $password, en el caso de sta ltima utilizamos la funcin md5 para encriptar la contrasea, por su parte mysql_real_escape_string es para asegurarnos de que la cadena que estamos enviando a mysql est completamente correcta. Despus realizamos una consulta a la tabla usuarios de nuestra base de datos con los valores dados en el formulario. Dicha consulta la guardamos en la variable $verifica para saber cuntas filas nos devuelve mediante el uso de la funcin mysql_num_rows, en caso de que la consulta arroje un resultado positivo el valor ser igual a 1, pero si no encontr ningn usuario y contrasea que coincidieran con los dados regresar el valor de 0 y se imprime un mensaje de error en la pgina para indicarle al usuario la falla. Al ser el nmero de filas de $verifica igual a 1 guardamos los valores dentro de las variables de sesin las cuales perdurarn mientras esta exista, en el caso de la variable $row le asignamos mediante la funcin mysql_fetch_array los valores que arroja la consulta y esto lo utilizamos para asignar a la variable $email el valor arrojado del campo email de la base de datos, finalmente mediante el uso de una etiqueta meta redireccionamos la pgina para que se actualice y entre a la seccin de miembros. La ltima parte de index.php sera el else en el cual entrarn las peticiones que no cumplieron con ninguna de las otras dos condiciones, dentro de este else se incluir el siguiente formulario:
<? else { ?> <h1>Login</h1> <form method="post" action="index.php" name="login" id="login"> <fieldset> <label for="username">Usuario:</label><input type="text" name="usuario" id="usuario" /><br /> <label for="password">Password:</label><input type="password" name="password" id="password" /><br /> <input type="submit" name="ingresar" id="ingresar" value="Ingresar" /> </fieldset> </form>

<p>Si deseas registrarte da click <a href=registro.php>AQUI</a></p> <?php } ?>

Logout de la sesin
Debemos incluir un link para que el usuario pueda cerrar sesin, este link llevar a una pgina a la cual podemos llamar logout.php o cerrar.php y que contendr un cdigo parecido al siguiente:
<?php include "bd.php; $_SESSION = array(); session_destroy(); ?> <meta http-equiv="refresh" content="0;index.php">

En el cual se destruye la sesin que se haba iniciado y con ello todos los valores de las variables globales de sesin se borran, finalmente con una etiqueta meta se redirecciona a la pgina index.php donde se nos mostrar el mensaje de bienvenida.

La pgina de registro de usuario


La pgina de registro ya depender de cada quien, en nuestro ejemplo la incluimos suponiendo que es una pgina de seguridad media, es decir que cualquiera pueda solicitar ingresar pero necesita un usuario y contrasea para ello, si tu no deseas que todo el mundo pueda mandar una solicitud de ingreso simplemente ignora este ltimo paso. Para crear la pgina de registro creamos un nuevo archivo llamado registro.php donde incluiremos un formulario para que el usuario pueda ingresar sus datos y al mandarlos se guarden en la base de datos o sean mandados a un servidor de correos para que sean aprobados o no por un administrador, para mandar una respuesta al usuario se puede pedir la direccin de correo en el formulario. Hay que recordar que estamos manejando encriptacin MD5 para las contraseas por lo que al momento de mandar insertar un nuevo registro el query debe lucir parecido a esto:
INSERT INTO usuarios (usuario, password, email) VALUES('".$usuario."', '".md5($password)."', '".$email."')

Para que al momento de guardarse en la tabla quede de manera que no pueda leerse a simple vista y que algn intruso no pueda robarse la informacin de alguna manera sencilla.

Para terminar
La seguridad es un aspecto siempre relevante en el desarrollo de cualquier aplicacin, existen personas que se especializan en ello y que ofrecen un servicio de consultora y/o

de desarrollo de sistemas y algoritmos especialmente enfocados a la seguridad de nuestros sitios y servidores, muchos de nosotros conocemos o hemos odo de este aspecto de manera general, por qu no aprovechar esto y empezar a aplicar buenas prcticas de seguridad en nuestro sitio, la primera de ellas puede ser implementar este sistema de sesiones que por lo menos mantendr un poco ms ocupados a aquellas personas que slo quieran realizar algn dao, proteger nuestra informacin es tarea de nosotros, las herramientas o instrumentos con los que lo realizaremos ya depende del presupuesto, tiempo o disposicin de cada quien.

S-ar putea să vă placă și