Creando un área de cliente para portfolios con PHP y MySQL – Segunda parte – Algunas Correcciones

En el post anterior repasábamos algunos aspectos para conseguir tener una seguridad básica en nuestro formulario de registro. En este post quiero, antes de pasar a la tercera parte, modificar un poco ése código y añadir alguna medida más de seguridad para un correcto funcionamiento. Gracias por la ayuda a @Zapy_91

Cambiando MD5 por otros cifrados.

En el post anterior usé la función MD5() para cifrar las contraseñas de nuestros usuarios a la hora de introducirlos en la base de datos. La función MD5 funciona bien, pero sin embargo SHA1() o SALT() son más seguras. Con MD5 tendremos una salida cifrada de 32 caracteres, dando igual la longitud de la contraseña. Con SHA1 tendremos una clave cifrada de 40 caracteres que la hace algo más segura, y por último, con SALT, podremos añadir nosotros nuestra propia cadena para así hacer más segura la contraseña. Esta última es la más recomendable ya que sólo el desarrollador puede comprender cómo está compuesta la frase.

Yo me voy a decantar en ésta parte por una cuarta opción: combinarlo todo.

Nuestra función de cifrado anterior era esta:

$pw = md5($password);

Y este va a ser nuestro nuevo cifrado:

$salt ='$str$/';
$pw = sha1(md5($salt.$password));

Espero que ésto nos ayude a comprender lo importante que es mantener la contraseña guardada y codificada para que otras personas no puedan aprovecharse de esos fallos.

Este será el código PHP final:

<?php 

require('db.php'); 

if(!empty($_POST)) { 
  if ($_POST["username"] == null 
   || $_POST["password"] == null 
   || $_POST["email"] == null 
   || $_POST["paypal"] == null){ 
     echo "Has dejado campos vacíos. Vuelve <a href='singup.php'>atrás y rellena el formulario.</a>"; 
  } else { 
     $username = mysql_real_escape_string($_POST["username"]);
     $salt = '$str$/';
     $password = mysql_real_escape_string(sha1(md5($salt.$_POST["password"])));
     $email = mysql_real_escape_string($_POST["email"]);
     $paypal = mysql_real_escape_string($_POST["paypal"]);
     //Comprueba si el usuario ya existe 
     mysql_query = ("SELECT username FROM clients") or die(mysql_error()); 
     // Genera un array con los clientes 
     while($row = mysql_fetch_array($result)){
       // Para cada registro, comprueba el nombre de usuario 
       if($row['username'] == $username){
          $usernameTaken = true; 
       } else {
          $usernameTaken = false;
       } 
     } 
     if($usernameTaken) {
       echo "El usuario ya existe.<br />Vuelve <a href='singup.php'>atrás y escoge otro</a>.";
     } else {
       // Creamos la consulta que nos insertará los datos y la ejecutamos
       mysql_query("INSERT INTO clients VALUES ('', '$username', '$password', '$email', '$paypal')");
       echo "Gracias por inscribirte.<br />Ahora puedes <a href='login.php'>iniciar sesión</a>"; 
     } 
  } 
} else { 
?>

Os habréis dado cuenta también de que he refactorizado el código. Podemos cifrar y guardar la contraseña en la variable en un sólo paso, en vez de hacerlo en 2. Además, he modificado la consulta SQL, que también se ejecutará de una sola vez. Además, como veréis, nos hemos ahorrado el uso de varias variables ($pw, $sql y $result) que había usado antes.

Al haber cambiado el cifrado anterior por éste, la longitud final de nuestra contraseña codificada HA CAMBIADO, con lo cual deberemos cambiar la longitud del campo “password” en la base de datos, de 32 caracteres a 40, que es la longitud del codificado SHA1. Recordad entrar a phpMyAdmin, y en la tabla “clients” cambiar la longitud del campo “password”.

Comprobando caracteres inválidos en el nombre de usuario

El siguiente paso es comprobar que no existen caracteres no válidos que se puedan insertar en el campo de usuario. Crearemos los caracteres no válidos para el campo de usuario.

Para especificar, vamos a asegurarnos de que el cliente sólo puede introducir letras a-z, A-Z o números 0-9.

Podemos usar expresiones regulares (/^[a-zA-Z0-9]+$/ en el código de abajo) para identificar los caracteres que nos gustaría permitir, y utilizar la función preg_match() para comprobarlo con nuestra cadena ($str). Nuestra cadena sería en este caso o bien el nombre de usuario o la contraseña.

!preg_match('/^[a-zA-Z0-9]+$/', $str);

El signo de exclamación delante de la función (!) significa NO, por lo cual la función anterior devolverá true si los valores $str y las expresiones regulares no son iguales, y falso si todo está bien. Para crear un código viable para hacer frente a esto, podemos utilizar un if/else básico.

if(!preg_match('/^[a-zA-Z0-9]+$/', $username)){ // Si el usuario es inválido
return "El usuario sólo puede contener letras y números."; // Avisamos al usuario
}

Esto lo podemos encadenar al resto de IF/ELSE de nuestro código PHP para la comprobación (De color azul).

<?php 

require('db.php'); 

if(!empty($_POST)) { 
  if ($_POST["username"] == null 
   || $_POST["password"] == null 
   || $_POST["email"] == null 
   || $_POST["paypal"] == null){ 
     echo "Has dejado campos vacíos. Vuelve <a href='singup.php'>atrás y rellena el formulario.</a>"; 
  } else { 
     $username = mysql_real_escape_string($_POST["username"]);
     $salt = '$str$/';
     $password = mysql_real_escape_string(sha1(md5($salt.$_POST["password"])));
     $email = mysql_real_escape_string($_POST["email"]);
     $paypal = mysql_real_escape_string($_POST["paypal"]);

     if(!preg_match('/^[a-zA-Z0-9]+$/', $username)){ // Si el usuario es inválido
        return "El usuario sólo puede contener letras y números."; // Avisamos al usuario
     } else {
        //Comprueba si el usuario ya existe
        mysql_query = ("SELECT username FROM clients") or die(mysql_error());
        // Genera un array con los clientes
        while($row = mysql_fetch_array($result)){
          // Para cada registro, comprueba el nombre de usuario 
          if($row['username'] == $username){ 
             $usernameTaken = true; 
          } else { 
             $usernameTaken = false;
          }
        }
        if($usernameTaken) {
           echo "El usuario ya existe.<br />Vuelve <a href='singup.php'>atrás y escoge otro</a>.";
        } else {
       // Creamos la consulta que nos insertará los datos y la ejecutamos
       mysql_query("INSERT INTO clients VALUES ('', '$username', '$password', '$email', '$paypal')");
       echo "Gracias por inscribirte.<br />Ahora puedes <a href='login.php'>iniciar sesión</a>"; 
     } 
    }
  } 
} else { 
?>

La función preg_match() nos ha servido para controlar qué caracteres queremos permitir en ciertos campos, por medio de las expresiones regulares. También podríamos haber usado la función eregi(), pero se comenta que es algo más lenta en ejecución. De todas formas es otra posibilidad, a elección de cada uno.

Espero poder continuar pronto con la tercera parte del tutorial, y poco a poco nos iremos acercando al área de administración.

Anuncios

Ayúdame a mejorar. Deja un comentario:

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s