1. Validación de formularios
1. EXPRESIONES REGULARES
C ontinuamos viendo aspectos referentes a la validación de
todo lo que el usuario introduce en un formulario y
posteriormente envía al servidor.
Ya sabemos que podemos comprobar si el usuario ha introducido
un dato obligatorio, pero ahora vamos a ir un poco más allá y
validaremos que lo que ha introducido tiene el formato adecuado.
El ejemplo más típico lo tenemos en este formulario que estamos
utilizando para que el usuario se identifique con su email y password.
Nosotros conocemos el formato o patrón que sigue cualquier
dirección de correo electrónico, por lo que podremos comparar lo que
ha 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 de
comprobar si la dirección introducida es la correspondiente a un
usuario o no.
Para hacer este tipo de comprobaciones se utilizan expresiones
regulares, 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 un
carácter arroba (@); que debe aparecer al menos una vez el punto, etc.
Copyright (c) Computer Aided Education S.A. 1
2. Validación de formularios
Todos estos detalles que decimos de forma tan flexible aquí, se
pueden 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 sea
una dirección de correo electrónico válida tiene que realizarse una vez
enviado el formulario al servidor. Así que cambiaremos la condición y
primero comprobaremos si no es la primera vez.
Y en la línea elseif escribimos código para cuando no es la
primera vez y no está vacío. En este caso, tiene que concordar lo
introducido con una dirección de correo electrónico válida.
Aquí utilizamos la función eregi para comprobar si la cadena
introducida por el usuario (que se almacena en el elemento email de
$_POST) concuerda con la expresión regular pasada como primer
argumento de la función.
Es muy difícil conseguir una expresión regular que acepte todas
las posibles direcciones válidas de correo electrónico. Por eso,
normalmente es mejor crear una expresión flexible abarcando posibles
direcciones incorrectas, que otra más concreta que pueda rechazar
alguna válida:
^[a-zA-Z0-9_-.]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$
Los modelos o expresiones regulares se construyen a partir de
caracteres que se toman de forma literal y otros que tienen un
significado especial.
Para su referencia, aquí se indica el significado de los
caracteres especiales. El resto se tomarán tal cual se escriben
en la expresión:
^: indica que el patrón siguiente debe aparecer al principio de
la cadena. Por ejemplo, ^a concordaría con ''ayuda'' pero no
con ''sin ayuda''.
2
3. Validación de formularios
$: indica que el patrón debe aparecer al final de la cadena. Por
ejemplo, com$ concordaría con ''empresa.com'', pero no con
''empresa.com.net''.
( ): grupo de caracteres que tienen que concordar
exactamente en la cadena comparada. Sirve para crear
subexpresiones.
[ ]: 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 deben
aparecer. 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 caracteres
anteriores. Por ejemplo, el patrón ho?a concordaría con
''hoja'', ''hola'', ''hora'' e incluso sólo con ''a'', ya que ho sería
opcional.
*: el asterisco representa cero o más veces los caracteres
anteriores. Por ejemplo, ge*m concordaría con ''gm'',
''geem'', pero no con ''germ'' o ''grm''.
+: representa uno o más de los caracteres anteriores. Por
ejemplo, foto[1-3]+ concordaría con ''foto1'', ''foto2'' o
''foto3''.
{n}: repetir n veces. Por ejemplo, a{5} representaría la
cadena ''aaaaa''.
{n1, n2}: representa un rango de posibles repeticiones de los
caracteres anteriores. Por ejemplo, a{2, 5} concordaría con
''aa'', ''aaa'', ''aaaa'' o ''aaaaa''.
: indica que el siguiente carácter es literal. Sirve para
especificar 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 crear
expresiones regulares, sino darle algunos ejemplos como éste para
validar las direcciones de correo electrónico u otro tipo de datos
usuales.
Copyright (c) Computer Aided Education S.A. 3
4. Validación 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 introduzca
un email y que ese email tenga un formato válido.
Fíjese que esto no asegura que la dirección electrónica que hemos
escrito sea una dirección correcta en nuestra tienda virtual, pero, al
menos, hemos filtrado aquellas cadenas que no pueden formar una
direcció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 fecha
en el formato d/m/aaaa.
Éstas son las funciones de PHP que puede utilizar:
ereg(patrón, cadena, [opciones]): comprueba si la
cadena pasada como segundo argumento concuerda con
el patrón pasado como primer argumento. La
comprobación tiene en cuenta la combinación de
mayúsculas y minúsculas.
4
5. Validación de formularios
eregi(modelo, cadena, [opciones]): como la anterior,
pero sin tener en cuenta la combinación de mayúsculas y
minúsculas.
ereg_replace(patrón, reemplazo, cadena): esta
función examina cadena buscando coincidencias de
patrón y reemplaza el texto encontrado con reemplazo.
eregi_replace(patrón, reemplazo, cadena): igual que
la anterior, pero sin diferenciar mayúsculas y minúsculas.
split(patrón, cadena, [límite]): divide la cadena en
elementos de un array según el patrón especificado.
Devuelve un array de cadenas, cada una de las cuales es
una subcadena de cadena formada al dividir ésta en los
límites formados por la expresión regular patrón. Si
ocurre un error, devuelve un valor falso.
Devuelve la cadena modificada. Si no hay coincidencias
que reemplazar, devuelve la cadena original.
spliti(patrón, cadena, [límite]): igual que la anterior
pero sin diferenciar entre mayúsculas y minúsculas.
Para ejemplos y mayor información referente a estas
funciones, acuda al manual de PHP.
De forma parecida podría escribir expresiones regulares para
muchos otros propósitos. Estas expresiones, junto a las funciones que
proporciona PHP, permiten filtrar datos incorrectos o no válidos.
2. LIMPIANDO LA INFORMACIÓN
V alidar la información proveniente del usuario es necesario
para evitar que éste pueda introducir datos que incluso
pudieran llegar a ser dañinos para nuestro sitio web o sirvieran para
obtener información confidencial.
Veámoslo con un ejemplo: el archivo registro.php.
Recuerde que esta página presenta el formulario donde los
usuarios tendrán que introducir sus detalles personales a la hora de
registrarse en la tienda virtual.
A modo de confirmación de esos datos, habíamos escrito código
php para mostrarlos una vez el usuario los ha enviado correctamente
al servidor.
Copyright (c) Computer Aided Education S.A. 5
6. Validación de formularios
Pues bien, esta práctica cada vez se utiliza menos porque es
peligroso mostrar en una página web la información que ha
suministrado 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ón
Enviar, el servidor ejecutará el código correspondiente a la página de
confirmación y devolverá ese código JavaScript.
Como resultado, el navegador lo ejecutará. En este caso lo que se
consigue es redirigir al usuario a una página distinta, con todo lo que
esto puede significar.
Pues bien, sepa que por defecto, la configuración del PHP no
permitiría que esto funcionara. Esto se consigue estableciendo a On el
parámetro magic_quotes_gpc del archivo de configuración php.ini.
El paquete xampp configura el entorno de ejecución php en el
archivo php.ini situado en la carpeta bin de apache.
c:apachefriendsxamppapachebinphp.ini
6
7. Validación de formularios
El parámetro magic_quotes_gpc de la configuración del PHP
sirve como filtro para la información suministrada vía get, post o como
Mantenga a
On el paráme-
cookies.
tro magic_quo-
tes_gpc. No Si está activado (valor On), entonces se comprueba toda esta
hacerlo repre-
senta un ries-
información y se escapa cualquier comilla simple (') o doble ('').
go importante
en la seguri- Esto impediría que se ejecutara el código JavaScript que hemos
dad.
escrito en el formulario, ya que realmente se mostraría así en el código
HTML 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 campo
Nombre del formulario ha sido escapada (con las barras inclinadas
hacia la izquierda delante de cada comilla), por lo que el código
JavaScript no ha llegado a ejecutarse.
Como primer aspecto a tener en cuenta, el parámetro
magic_quotes_gpc debe estar activado. Sin embargo, esto no es
suficiente.
En ocasiones será necesario que el usuario pueda introducir texto
con caracteres como <, >, etc., que representan un riesgo de seguridad.
Para estos casos, PHP proporciona dos funciones que nos pueden
ser de utilidad. Lo que deberemos hacer es utilizarlas contra la
informació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 del
texto, aunque también podemos establecer algunas
excepciones.
echo strip_tags($_POST["nombre"]);
En el caso anterior hubiese devuelto:
location.href="www.dominiocracker.com"
htmlspecialchars: esta función cambia algunos caracteres
especiales por su codificación en HTML. Los cambios son los
siguientes:
Copyright (c) Computer Aided Education S.A. 7
8. Validación de formularios
< --> <
> --> >
& --> &
echo htmlspecialchars($_POST["nombre"]);
produciría:
<script language="
javascript">location.href="http://www.dominiocrack
er.com"</script>
aunque el navegador mostraría el texto siguiente, sin ejecutarlo
como 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, el
Otra función código HTML no incluye < o > sino su correspondiente codificación
útil para el
propósito que
< y >, respectivamente.
estamos vien-
do es trim, En resumen, vemos que es necesario validar la información
que elimina
los espacios
suministrada por el usuario. Esto será incluso más importante cuando
en blanco al se guarde en un archivo o en una base de datos.
principio y al
final de las
cadenas de
Utilizar sin ninguna prudencia dicha información nos puede
texto. llevar a resultados inesperados y, lo que es peor, incluso dañinos para
nuestro sitio web.
3. COMPROBAR EL FORMULARIO DE ORIGEN
E xiste un problema adicional de seguridad cuando trabajamos
con la información proveniente del usuario. Se trata de cómo
conocer desde qué página se está accediendo a la página que recoge
dicha información.
Dependiendo de la importancia de los datos suministrados, esto
puede ser crucial o no.
Imagine esta situación: usted ha preparado la página login.php
para que los usuarios puedan identificarse proporcionando su email y
contraseña.
8
9. Validación de formularios
A partir de dichos datos, permitirá que puedan comprar en su
tienda virtual, identificándolos como clientes que ya han sido
registrados en su base de datos.
Es decir, que una vez introducidos estos dos detalles
correctamente en login.php, ese usuario accederá a la página donde
puede confirmar (por ejemplo, confirmarpedido.php) su compra
porque ya se ha identificado.
Lógicamente, a esta última página no debería poder acceder si no
se ha identificado correctamente. Pero, ¿cómo saber que proviene del
formulario 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ía
simplemente utilizar el nombre de dicha página en el atributo action
de 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 del
array superglobal $_SERVER.
Sin embargo, no podemos confiar en ese valor porque puede ser
fácilmente modificable y aparentar el valor que nosotros esperamos
aunque realmente no se provenga de la página correcta.
Veremos que es necesario identificar claramente al usuario una
vez haya pasado por login.php. Y esa forma será a través de cookies
o variables de sesión.
Copyright (c) Computer Aided Education S.A. 9