Validación de variables en PHP.

Resumen.

Ya hemos dicho que un capitulo u otro son muy importantes, pero la importancia de este capitulo es trascendental dado que afecta a la seguridad de nuestros sitios Web. La validación de datos es una tarea tediosa y pesada, pero no por ello debemos descuidarla. En este artículo veremos la diferencia entre validar desde el lado del cliente (del navegador) o validar con PHP, (desde el servidor). Si lo haces bien, tu Web será sencillamente invulnerable.

Artículo.

Si hay algo que es recurrente en cualquier lenguaje en cualquier sitio Web es la validación de datos. La validación de datos puede hacerse a dos niveles, se puede hacer a nivel de navegador con HTML5, JavaScript y sus librerías (jquery) y se puede hacer a nivel de servidor.

La validación a nivel de navegador es muy útil ya que puede informar al usuario del error en tiempo real y antes del envío de un formulario. Pero esta validación tiene un inconveniente, cualquier hacker se la puede saltar eliminando las funciones JavaScript de su navegador.

Con esto, nos queda la validación a nivel de servidor, esta validación es imposible saltársela, si es que está bien hecha, por supuesto. La validación puede ser más o menos fuerte, por ejemplo, podemos usar la función FILTER_VALIDATE_EMAIL, y lo podemos hacer de la siguiente manera:
<?php // Validacion mas sencilla de email $email = 'mi_mail@artesaniaweb.es'; if (filter_var($email, FILTER_VALIDATE_EMAIL)){ $valida_mail = $email; }else{ $valida_mail = 'E-mail NO valido'; } echo $valida_mail; ?>
Como podemos ver, para realizar la validación hemos tenido que recurrir a la función filter_var() y una estructura condicional “else”.

Otra forma muy poderosa de validar datos es mediante el uso de expresiones regulares. El problema de las expresiones regulares es que de por si solas no nos resultan validas para realizar una validación, lo que nos lleva a usar diferentes estructuras, que muchas veces se hacen demasiado extensas. Veamos cómo aplicamos la expresión regular /(^[a-z0-9._-]{2,40})+(@[a-z0-9._-]{4,30})+\.[a-z]{2,4}$/i mediante una función.
<?php // Funcion para validar e-mail con expresión regular function Validar_Mail($email){ if(preg_match("/(^[a-z0-9._-]{2,40})+(@[a-z0-9._-]{4,30})+\.[a-z]{2,4}$/i",$email)){ return strtolower($email); }else{ $valida_mail = 'Email NO valido'; return $valida_mail; } } // Aplicamos la funcion $email = 'mi_Mail@artesaniaWeb.es'; $valida_mail = Validar_Mail($email); echo $valida_mail; ?>
Como podemos ver, esta función precisa de una función nativa “preg_match()” y una estructura condicional “else”. Además, se ha agregado la función nativa “strtolower()” para pasar todos los caracteres a minúsculas cuando el e-mail es válido, ya que como sabemos, en una dirección de e-mail no tiene sentido diferenciar entre mayúsculas y minúsculas.

En ambos casos de validación podemos ver que resulta bastante sencillo, o al menos no demasiado complicado, pero la cosa se complica bastante cuando tenemos que validar un formulario que contiene varios campos, y se complicará tanto más cuanto más campos sea preciso validar.

La forma más sencilla que podemos usar para validar varios campos de manera sencilla es dicotomizar la respuesta, es decir, que la función de validación devuelva 0 para dato no valido y 1 para dato válido.
<?php // Funcion para validar e-mail con expresión regular y respuesta dicotomica function Validar_Mail($email){ if(preg_match("/(^[a-z0-9._-]{2,40})+(@[a-z0-9._-]{4,30})+\.[a-z]{2,4}$/i",$email)){ $respuesta = 1; return $respuesta; }else{ $respuesta = 0; return $respuesta; } } // Aplicamos la funcion $email = 'mi_Mail@artesaniaWeb.es'; $valida_mail = Validar_Mail($email); echo $valida_mail; ?>
Para validar otro tipo de dato, como por ejemplo, un nombre de usuario, una clave o un número de teléfono, solo tenemos que modificar la expresión regular de la función. Así, cuando aplicásemos las diferentes funciones de validación para cada dato tendríamos como respuesta en todos los casos valores 0 y 1, y como sabemos cualquier valor que multipliques por 0, siempre dará como resultado 0. Así podemos crear el siguiente condicional:
<?php // Condicional para validar varios datos $valida_nombre = 1; $valida_email = 1; $valida_asunto = 1; $valida_mensaje = 1; $producto = $valida_nombre*$valida_email*$valida_asunto*$valida_mensaje; if($producto > 0){ echo 'Todos los datos son válidos.'; // Aquí iria el codigo que enviase los datos }else{ echo 'Algún dato NO es válido, intentelo de nuevo.'; } ?>
Esta función, tal cual está, sigue haciendo las tareas de validación un tanto arduas, ya que habría que crear una función para validar cada tipo de dato. ¿Cómo podemos mejorar esta función para hacer la pesada tarea de validación más sencilla?

Pues podemos hacer una pequeña modificación en nuestra función para que en lugar de solo recibir la variable que deseamos validar, también reciba la expresión regular que queremos usar. Así, nuestra función quedaría de la siguiente manera.
<?php /* Funcion para validar con diferentes expresiones regulares y respuesta dicotomica */ function Validar_Datos($dato,$exp_regular){ if(preg_match($exp_regular, $dato)){ // Dato valido $respuesta = 1; return $respuesta; }else{ // Dato NO valido $respuesta = 0; return $respuesta; } } // Aplicamos la funcion $usuario = 'Pepe27'; $expr_usua = '/^[a-z0-9-_]{4,25}$/i'; $email = 'mi_mail@artesaniaWeb.es'; $expr_mail = '/(^[a-z0-9._-]{2,40})+(@[a-z0-9._-]{4,30})+\.[a-z]{2,4}$/i'; $valida_usuario = Validar_Datos($usuario,$expr_usua); $valida_mail = Validar_Datos($email,$expr_mail); $datos_form = $valida_usuario * $valida_mail; if($datos_form > 0){ echo "Usuario: $valida_usuario <br /> E-mail: $valida_mail <br /> Aqui, por ejemplo, podriamos poner el codigo para guardar los datos en una BD"; }else{ echo "Usuario: $valida_usuario <br /> E-mail: $valida_mail <br /> Algun dato NO es valido."; } ?>
De esta forma, con una sola función podemos validar cualquier dato de nuestro formulario con apenas dos o tres líneas de código por variable a validar, solo es cuestión de aplicar la expresión regular correcta a cada dato. Sencillo ¿verdad?

Llegados a este punto podemos hacernos una pregunta, ¿esta función es mejorable? Pues si, podemos hacer una pequeña mejora que nos evitaría multiplicar el resultado de cada validación para saber si algún dato no es válido. Para ello modificamos el valor de la variable $respuesta cuando el dato no es válido, $respuesta = 0 pasa a ser $respuesta = null. De esta forma tenemos un condicional que nos detecta las variables nulas, es el condicional isset($variable1, $variable2, $variable3…). Este condicional nos permite detectar si todas o alguna variable es nula con solo enumerarlas separadas por comas. También hemos sacado el “return” del condicional, es una forma de ahorrarnos una línea de código, por otro lado, innecesaria. De esta manera el código quedaría de la siguiente forma.
<?php /* Funcion mejorada para validar con diferentes expresiones  regulares y respuesta dicotomica */ function Validar_Datos($dato,$exp_regular){     if(preg_match($exp_regular$dato)){         // Dato valido         $respuesta 1;     }else{         // Dato NO valido         $respuesta null;     }     return $respuesta; } // Aplicamos la funcion $usuario 'Pepe,27'; $expr_usua '/^[a-z0-9-_]{4,25}$/i'; $email 'mi_mail@artesaniaWeb.es'; $expr_mail '/(^[a-z0-9._-]{2,40})+(@[a-z0-9._-]{4,30})+\.[a-z]{2,4}$/i'; $valida_usuario Validar_Datos($usuario,$expr_usua); $valida_mail Validar_Datos($email,$expr_mail); if(isset($valida_usuario,$valida_mail)){     // Todos los datos son validos     echo "Usuario: $valida_usuario <br />      E-mail: $valida_mail <br />     Aqui, por ejemplo, podriamos poner el codigo para      guardar los datos en una BD"; }else{     // Alguno o todos los datos NO son validos     echo "Usuario: $valida_usuario <br />      E-mail: $valida_mail <br />     Algun dato <b>NO</b> es valido."; } ?>
Con esta modificación se pretende ejemplificar que aunque nuestros códigos funcionen a la perfección, muchas veces pueden ser mejorados aunque sea de manera sutil. La programación es muchas veces como un texto bien escrito, no es suficiente con lo que digas y que lo que hagas sea cierto y funcione, también se puede ser elegante a lo hora de decirlo y hacerlo.

Y con esto concluimos el artículo dedicado a la validación de datos, ni qué decir tiene que cada dato que queremos validar requiere de su propia expresión regular, de las que hay muchísimas por estos lares de Internet. Si no sabes crearlas, seguro que encuentras alguna que se adapta a tu necesidad, ponlas a prueba con esta sencilla función.
Tags: validación || regular || servidor || preg_match || filter_var || strtolower

Comentarios.

Sin comentarios, publica el tuyo.