Manual php lec13.validacion_de_formularios

10

Click here to load reader

Transcript of Manual php lec13.validacion_de_formularios

Page 1: Manual php lec13.validacion_de_formularios

Continuamos viendo aspectos referentes a la validación detodo lo que el usuario introduce en un formulario y

posteriormente envía al servidor.

Ya sabemos que podemos comprobar si el usuario ha introducidoun dato obligatorio, pero ahora vamos a ir un poco más allá yvalidaremos que lo que ha introducido tiene el formato adecuado.

El ejemplo más típico lo tenemos en este formulario que estamosutilizando para que el usuario se identifique con su email y password.

Nosotros conocemos el formato o patrón que sigue cualquierdirección de correo electrónico, por lo que podremos comparar lo queha introducido el usuario con dicho patrón para saber si, en apariencia,el dato introducido es correcto.

Una vez superada esta validación, ya será momento decomprobar si la dirección introducida es la correspondiente a unusuario o no.

Para hacer este tipo de comprobaciones se utilizan expresionesregulares, que no son más que una forma de especificar, exactamente,el formato que debe cumplir una cadena de texto.

Por ejemplo, en el caso del email, sabemos que debe incluir uncarácter arroba (@); que debe aparecer al menos una vez el punto, etc.

1Copyright (c) Computer Aided Education S.A.

Validación dde fformularios

1. EEXPRESIONES RREGULARES

Page 2: Manual php lec13.validacion_de_formularios

Todos estos detalles que decimos de forma tan flexible aquí, sepueden expresar exactamente utilizando una expresión regular.

<?php if (!$primeravez)

if (empty($_POST["email"]))echo "<tr><td></td><td class='error'>¡Tiene que

introducir su email!</td></tr>";elseif (!eregi("^[a-zA-Z0-9_\-\.]+@[a-zA-Z0-9\-]+\.

[a-zA-Z0-9\-\.]+$", $_POST["email"]))echo "<tr><td></td><td class='error'>¡Email no

válido!</td></tr>";?>

Tanto la validación de que se haya escrito algo como de que seauna dirección de correo electrónico válida tiene que realizarse una vezenviado el formulario al servidor. Así que cambiaremos la condición yprimero comprobaremos si no es la primera vez.

Y en la línea elseif escribimos código para cuando no es laprimera vez y no está vacío. En este caso, tiene que concordar lointroducido con una dirección de correo electrónico válida.

Aquí utilizamos la función eregi para comprobar si la cadenaintroducida por el usuario (que se almacena en el elemento email de$_POST) concuerda con la expresión regular pasada como primerargumento de la función.

Es muy difícil conseguir una expresión regular que acepte todaslas posibles direcciones válidas de correo electrónico. Por eso,normalmente es mejor crear una expresión flexible abarcando posiblesdirecciones incorrectas, que otra más concreta que pueda rechazaralguna válida:

^[a-zA-Z0-9_\-\.]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$

Los modelos o expresiones regulares se construyen a partir decaracteres que se toman de forma literal y otros que tienen unsignificado especial.

Para su referencia, aquí se indica el significado de loscaracteres especiales. El resto se tomarán tal cual se escribenen la expresión:

^: indica que el patrón siguiente debe aparecer al principio dela cadena. Por ejemplo, ^a concordaría con ''ayuda'' pero nocon ''sin ayuda''.

2

Validación de formularios

Page 3: Manual php lec13.validacion_de_formularios

$: indica que el patrón debe aparecer al final de la cadena. Porejemplo, com$ concordaría con ''empresa.com'', pero no con''empresa.com.net''.

( ): grupo de caracteres que tienen que concordarexactamente en la cadena comparada. Sirve para crearsubexpresiones.

[ ]: engloba un conjunto de caracteres optativos. Por ejemplo,ca[js]a concordaría tanto con ''caja'' como con ''casa''.

[^]: engloba un conjunto de caracteres que no debenaparecer. Por ejemplo ca[^js]a podría concordar con ''cada'',''cata'', etc., pero no con ''caja'' y ''casa''.

-: representa un rango de caracteres. Por ejemplo, [1-5]representaría los dígitos del 1 al 5.

.: el punto representa cualquier conjunto de caracteres.

?: el interrogante representa cero o una vez los caracteresanteriores. Por ejemplo, el patrón ho?a concordaría con''hoja'', ''hola'', ''hora'' e incluso sólo con ''a'', ya que ho seríaopcional.

*: el asterisco representa cero o más veces los caracteresanteriores. Por ejemplo, ge*m concordaría con ''gm'',''geem'', pero no con ''germ'' o ''grm''.

+: representa uno o más de los caracteres anteriores. Porejemplo, foto[1-3]+ concordaría con ''foto1'', ''foto2'' o''foto3''.

{n}: repetir n veces. Por ejemplo, a{5} representaría lacadena ''aaaaa''.

{n1, n2}: representa un rango de posibles repeticiones de loscaracteres anteriores. Por ejemplo, a{2, 5} concordaría con''aa'', ''aaa'', ''aaaa'' o ''aaaaa''.

\: indica que el siguiente carácter es literal. Sirve paraespecificar caracteres especiales como literales. Por ejemplo,4\*5 concordaría con la expresión aritmética del producto''4*5''.

|: representa cadenas alternativas. Por ejemplo, (Juan|Ana)concordaría con ''Juan'' o ''Ana''.

Desde luego, no es nuestra intención estudiar cómo crearexpresiones regulares, sino darle algunos ejemplos como éste paravalidar las direcciones de correo electrónico u otro tipo de datosusuales.

3Copyright (c) Computer Aided Education S.A.

Validación de formularios

Page 4: Manual php lec13.validacion_de_formularios

En el caso de que la función eregi devuelva el valor FALSE,entonces no se trata de un email válido, por lo que lo indicaremos así:

echo "<tr><td></td><td class='error'>¡Email no válido!</td></tr>";

Con esto ya estamos realizando dos validaciones: que introduzcaun email y que ese email tenga un formato válido.

Fíjese que esto no asegura que la dirección electrónica que hemosescrito sea una dirección correcta en nuestra tienda virtual, pero, almenos, hemos filtrado aquellas cadenas que no pueden formar unadirección válida.

Otras expresiones útiles:

Password de como mínimo 6 y máximo 10 caracteres:^[a-zA-Z0-9]{6, 10}$URL válida:

^(http|https)://(www\.)?.+\.(com|net|org|es|ar|mx)$

([0-9]{1,2})/([0-9]{1,2})/([0-9]{4}): una fechaen el formato d/m/aaaa.

Éstas son las funciones de PHP que puede utilizar:

ereg(patrón, cadena, [opciones]): comprueba si lacadena pasada como segundo argumento concuerda conel patrón pasado como primer argumento. Lacomprobación tiene en cuenta la combinación demayúsculas y minúsculas.

4

Validación de formularios

Page 5: Manual php lec13.validacion_de_formularios

eregi(modelo, cadena, [opciones]): como la anterior,pero sin tener en cuenta la combinación de mayúsculas yminúsculas.

ereg_replace(patrón, reemplazo, cadena): estafunción examina cadena buscando coincidencias depatrón y reemplaza el texto encontrado con reemplazo.

eregi_replace(patrón, reemplazo, cadena): igual quela anterior, pero sin diferenciar mayúsculas y minúsculas.

split(patrón, cadena, [límite]): divide la cadena enelementos de un array según el patrón especificado.Devuelve un array de cadenas, cada una de las cuales esuna subcadena de cadena formada al dividir ésta en loslímites formados por la expresión regular patrón. Siocurre un error, devuelve un valor falso.

Devuelve la cadena modificada. Si no hay coincidenciasque reemplazar, devuelve la cadena original.

spliti(patrón, cadena, [límite]): igual que la anteriorpero sin diferenciar entre mayúsculas y minúsculas.

Para ejemplos y mayor información referente a estasfunciones, acuda al manual de PHP.

De forma parecida podría escribir expresiones regulares paramuchos otros propósitos. Estas expresiones, junto a las funciones queproporciona PHP, permiten filtrar datos incorrectos o no válidos.

Validar la información proveniente del usuario es necesariopara evitar que éste pueda introducir datos que incluso

pudieran llegar a ser dañinos para nuestro sitio web o sirvieran paraobtener información confidencial.

Veámoslo con un ejemplo: el archivo registro.php.

Recuerde que esta página presenta el formulario donde losusuarios tendrán que introducir sus detalles personales a la hora deregistrarse en la tienda virtual.

A modo de confirmación de esos datos, habíamos escrito códigophp para mostrarlos una vez el usuario los ha enviado correctamenteal servidor.

5Copyright (c) Computer Aided Education S.A.

Validación de formularios

2. LLIMPIANDO LLA IINFORMACIÓN

Page 6: Manual php lec13.validacion_de_formularios

Pues bien, esta práctica cada vez se utiliza menos porque espeligroso mostrar en una página web la información que hasuministrado el usuario.

Por ejemplo, si el usuario en lugar de introducir su nombre,escribe algo como:

<script language=''javascript''>location.href=''http://www.dominiocracker.com''</script>

¿Qué problema hay? Pues que cuando pulsemos en el botónEnviar, el servidor ejecutará el código correspondiente a la página deconfirmación y devolverá ese código JavaScript.

Como resultado, el navegador lo ejecutará. En este caso lo que seconsigue es redirigir al usuario a una página distinta, con todo lo queesto puede significar.

Pues bien, sepa que por defecto, la configuración del PHP nopermitiría que esto funcionara. Esto se consigue estableciendo a On elparámetro magic_quotes_gpc del archivo de configuración php.ini.

El paquete xampp configura el entorno de ejecución php en elarchivo php.ini situado en la carpeta bin de apache.

c:\apachefriends\xampp\apache\bin\php.ini

6

Validación de formularios

Page 7: Manual php lec13.validacion_de_formularios

El parámetro magic_quotes_gpc de la configuración del PHPsirve como filtro para la información suministrada vía get, post o comocookies.

Si está activado (valor On), entonces se comprueba toda estainformación y se escapa cualquier comilla simple (') o doble ('').

Esto impediría que se ejecutara el código JavaScript que hemosescrito en el formulario, ya que realmente se mostraría así en el códigoHTML de la página de confirmación:

<script language=\''javascript\''>location.href=\"www.dominiocracker.es\"</script>

Fíjese que cada comilla doble que introdujimos en el campoNombre del formulario ha sido escapada (con las barras inclinadashacia la izquierda delante de cada comilla), por lo que el códigoJavaScript no ha llegado a ejecutarse.

Como primer aspecto a tener en cuenta, el parámetromagic_quotes_gpc debe estar activado. Sin embargo, esto no essuficiente.

En ocasiones será necesario que el usuario pueda introducir textocon caracteres como <, >, etc., que representan un riesgo de seguridad.

Para estos casos, PHP proporciona dos funciones que nos puedenser de utilidad. Lo que deberemos hacer es utilizarlas contra lainformación suministrada por el usuario para “limpiarla”.

Estas dos funciones son: strip_tags y htmlspecialchars.

strip_tags: esta función elimina todas las etiquetas HTML deltexto, aunque también podemos establecer algunasexcepciones.

echo strip_tags($_POST["nombre"]);

En el caso anterior hubiese devuelto: location.href=\"www.dominiocracker.com\"

htmlspecialchars: esta función cambia algunos caracteresespeciales por su codificación en HTML. Los cambios son lossiguientes:

7Copyright (c) Computer Aided Education S.A.

Validación de formularios

Mantenga aOn el paráme-tro magic_quo-

tes_gpc. Nohacerlo repre-senta un ries-go importante

en la seguri-dad.

Page 8: Manual php lec13.validacion_de_formularios

< --> &lt;> --> &gt;& --> &amp;

echo htmlspecialchars($_POST["nombre"]);

produciría:&lt;script language=\&quot;javascript\&quot;&gt;location.href=\&quot;http://www.dominiocracker.com\&quot;&lt;/script&gt;

aunque el navegador mostraría el texto siguiente, sin ejecutarlocomo código JavaScript:

<script language=\"javascript\">location.href=\"http://www.dominiocracker.com\"</script>

Vemos que en el código HTML se muestra el texto completo,pero como se ha codificado mediante la función htmlspecialchars, elcódigo HTML no incluye < o > sino su correspondiente codificación&lt; y &gt;, respectivamente.

En resumen, vemos que es necesario validar la informaciónsuministrada por el usuario. Esto será incluso más importante cuandose guarde en un archivo o en una base de datos.

Utilizar sin ninguna prudencia dicha información nos puedellevar a resultados inesperados y, lo que es peor, incluso dañinos paranuestro sitio web.

Existe un problema adicional de seguridad cuando trabajamoscon la información proveniente del usuario. Se trata de cómo

conocer desde qué página se está accediendo a la página que recogedicha información.

Dependiendo de la importancia de los datos suministrados, estopuede ser crucial o no.

Imagine esta situación: usted ha preparado la página login.phppara que los usuarios puedan identificarse proporcionando su email ycontraseña.

8

Validación de formularios

Otra funciónútil para el

propósito queestamos vien-

do es trim,que eliminalos espaciosen blanco alprincipio y al

final de lascadenas de

texto.

3. CCOMPROBAR EEL FFORMULARIO DDE OORIGEN

Page 9: Manual php lec13.validacion_de_formularios

A partir de dichos datos, permitirá que puedan comprar en sutienda virtual, identificándolos como clientes que ya han sidoregistrados en su base de datos.

Es decir, que una vez introducidos estos dos detallescorrectamente en login.php, ese usuario accederá a la página dondepuede confirmar (por ejemplo, confirmarpedido.php) su compraporque ya se ha identificado.

Lógicamente, a esta última página no debería poder acceder si nose ha identificado correctamente. Pero, ¿cómo saber que proviene delformulario login.php y no de otra página?

¿Cómo impedimos que se acceda directamente a confirmar-pedido.php sin pasar primero por la de login? Un usuario podríasimplemente utilizar el nombre de dicha página en el atributo actionde su formulario para “engañar” a nuestro sistema.

Una primera aproximación será comprobar desde dónde se viene.Este detalle viene dado a través de la variable HTTP_REFERER delarray superglobal $_SERVER.

Sin embargo, no podemos confiar en ese valor porque puede serfácilmente modificable y aparentar el valor que nosotros esperamosaunque realmente no se provenga de la página correcta.

Veremos que es necesario identificar claramente al usuario unavez haya pasado por login.php. Y esa forma será a través de cookieso variables de sesión.

9Copyright (c) Computer Aided Education S.A.

Validación de formularios

Page 10: Manual php lec13.validacion_de_formularios