Spanish (Español) translation by Ana Paulina Figueroa (you can also view the original English article)
La validación de datos es una parte integral del trabajo con formularios. Los datos que se envían y que no son válidos no solo pueden ocasionar problemas de seguridad, sino que también pueden dañar tu página web. Hoy veremos cómo eliminar caracteres no permitidos y cómo validar datos usando la función "filter_var".
Puedes ver un ejemplo a continuación. Un usuario ha escrito el texto "I don't have one" ("No tengo una") como su página web. Si estos datos fueran introducidos a una base de datos y posteriormente se recuperaran como un enlace, el enlace no funcionaría.


La mayoría de las personas suelen pensar en la validación de datos como un proceso inmensamente tedioso en el que uno tiene que:
- Comparar los datos que uno quiera validar con todas las combinaciones posibles que uno pueda imaginar.
- Intentar encontrar una expresión regular dorada que coincida con todas las combinaciones posibles.
- Usar una combinación de ambas opciones.
Existen problemas evidentes con lo listado anteriormente:
- Es una absoluta pérdida de tiempo.
- Existe una muy alta probabilidad de cometer errores.
Afortunadamente, a partir de la versión 5.2, PHP ha incluido una excelente función llamada filter_var que elimina el sufrimiento causado por la validación de datos.
filter_var en acción
filter_var llevará a cabo ambas tareas, desinfectar y validar los datos. ¿Cuál es la diferencia entre ambas?
- La desinfección eliminará cualquier carácter no permitido de los datos.
- La validación determinará si los datos tienen el formato adecuado.
Nota: ¿por qué desinfectar y no solamente validar? Es posible que el usuario haya escrito accidentalmente un carácter incorrecto, o tal vez haya sido debido a un proceso de copiado y pegado incorrecto. Desinfectando los datos tú asumes la responsabilidad de buscar el error del usuario.
Cómo usar filter_var
El uso de filter_var es increíblemente sencillo. Simplemente es una función de PHP que recibe dos piezas de datos:
- La variable que quieras verificar
- El tipo de verificación a usar
Por ejemplo, el siguiente código eliminará todas las etiquetas HTML de una cadena:
1 |
$string = "<h1>Hello, World!</h1>"; |
2 |
$new_string = filter_var($string, FILTER_SANITIZE_STRING); |
3 |
// $new_string is now "Hello, World!"
|
Aquí tienes otro ejemplo, esta vez es uno más difícil. El siguiente código garantizará que el valor de la variable sea una dirección IP válida:
1 |
$ip = "127.0.0.1"; |
2 |
$valid_ip = filter_var($ip, FILTER_VALIDATE_IP); |
3 |
// $valid_ip is TRUE
|
4 |
|
5 |
$ip = "127.0.1.1.1.1"; |
6 |
$valid_ip = filter_var($ip, FILTER_VALIDATE_IP); |
7 |
// $valid_ip is FALSE
|
Así de simple es usar filter_var. Para obtener una lista completa de todas las reglas que puedes verificar, consulta la parte final de este tutorial.
Ejemplo de desinfección
A continuación se muestra un ejemplo rápido de desinfección de la entrada proveniente de dos campos: un campo de correo electrónico y un campo de página web. Este ejemplo eliminará los caracteres que no deberían aparecer en ninguno de los tipos de datos.
1 |
<?php
|
2 |
if (isset($_POST['email'])) { |
3 |
echo filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); |
4 |
echo "<br/><br/>"; |
5 |
}
|
6 |
|
7 |
if (isset($_POST['homepage'])) { |
8 |
echo filter_var($_POST['homepage'], FILTER_SANITIZE_URL); |
9 |
echo "<br/><br/>"; |
10 |
}
|
11 |
?>
|
12 |
|
13 |
<form name="form1" method="post" action="form-sanitize.php"> |
14 |
Email Address: <br/>
|
15 |
<input type="text" name="email" value="<?php echo $_POST['email']; ?>" size="50"/> <br/><br/> |
16 |
Home Page: <br/>
|
17 |
<input type="text" name="homepage" value="<?php echo $_POST['homepage']; ?>" size="50" /> <br/> |
18 |
<br/>
|
19 |
<input type="submit" /> |
20 |
</form>
|


Mediante el uso de las constantes FILTER_SANITIZE_EMAIL y FILTER_SANITIZE_URL definidas por PHP, el trabajo de averiguar qué caracteres no están permitidos desaparece.
Ejemplo de validación
El hecho de que los datos estén desinfectados no garantiza que tengan el formato correcto. En el ejemplo a continuación no era necesario desinfectar los datos, pero es obvio que la entrada del usuario no es un correo electrónico ni un URL.


Para garantizar que los datos tengan el formato apropiado es necesario validarlos.
1 |
<?php
|
2 |
if (isset($_POST['email'])) { |
3 |
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); |
4 |
if (filter_var($email, FILTER_VALIDATE_EMAIL)) { |
5 |
echo "$email is a valid email address.<br/><br/>"; |
6 |
} else { |
7 |
echo "$email is <strong>NOT</strong> a valid email address.<br/><br/>"; |
8 |
}
|
9 |
}
|
10 |
|
11 |
if (isset($_POST['homepage'])) { |
12 |
$homepage = filter_var($_POST['homepage'], FILTER_SANITIZE_URL); |
13 |
if (filter_var($homepage, FILTER_VALIDATE_URL)) { |
14 |
echo "$homepage is a valid URL.<br/><br/>"; |
15 |
} else { |
16 |
echo "$homepage is <strong>NOT</strong> a valid URL.<br/><br/>"; |
17 |
}
|
18 |
}
|
19 |
?>
|
20 |
|
21 |
<form name="form1" method="post" action="form-validate.php"> |
22 |
Email Address: <br/>
|
23 |
<input type="text" name="email" value="<?php echo $_POST['email']; ?>" size="50"/> <br/><br/> |
24 |
Home Page: <br/>
|
25 |
<input type="text" name="homepage" value="<?php echo $_POST['homepage']; ?>" size="50" /> <br/> |
26 |
<br/>
|
27 |
<input type="submit" /> |
28 |
</form>
|


Ahora que los datos han sido validados, puedes estar seguro de que la información enviada es exactamente lo que quieres obtener.
Integrándolo todo: un formulario de envío de correo electrónico
Ahora que la desinfección y la validación de los datos han sido cubiertas, pondremos esas habilidades en uso con un rápido formulario de envío de correo electrónico. Este de ninguna manera tendrá la calidad necesaria para ponerlo en producción (por ejemplo, ningún formulario debería requerir una página web), pero funcionará perfectamente para este tutorial. El formulario recibirá 4 piezas de información:
- Nombre
- Dirección de correo electrónico
- Página web
- Mensaje
Desinfectaremos y validaremos corroborando las 4 piezas de datos, y solamente enviaremos el correo electrónico si todas son válidas. Si algo no es válido, o si algún campo está vacío, se le presentará el formulario al usuario junto con una lista de elementos a corregir. También devolveremos los datos desinfectados al usuario, en caso de que no sepa que ciertos caracteres no están permitidos.
Paso 1: creando el formulario
Para el primer paso, simplemente crea un elemento de formulario con 5 campos: los cuatro mostrados en la lista anterior y un botón de envío:
1 |
<form name="form1" method="post" action="form-email.php"> |
2 |
Name: <br/>
|
3 |
<input type="text" name="name" value="<?php echo $_POST['name']; ?>" size="50" /><br/><br/> |
4 |
Email Address: <br/>
|
5 |
<input type="text" name="email" value="<?php echo $_POST['email']; ?>" size="50"/> <br/><br/> |
6 |
Home Page: <br/>
|
7 |
<input type="text" name="homepage" value="<?php echo $_POST['homepage']; ?>" size="50" /> <br/><br/> |
8 |
Message: <br/>
|
9 |
<textarea name="message" rows="5" cols="50"><?php echo $_POST['message']; ?></textarea> |
10 |
<br/>
|
11 |
<input type="submit" name="Submit" /> |
12 |
</form>
|
Paso 2: determina si el formulario fue enviado
Puedes verificar si un formulario fue enviado revisando si el botón de envío estaba "definido". Coloca el siguiente código arriba de tu formulario:
1 |
if (isset($_POST['Submit'])) { |
2 |
|
3 |
}
|
Paso 4: validando el campo del nombre y del mensaje
Dado que tanto el campo del nombre como el del mensaje serán desinfectados y validados de la misma forma, los revisaremos juntos. Primero revisa si alguno de los campos está vacío haciendo lo siguiente:
1 |
if ($_POST['name'] == "") |
2 |
|
3 |
if ($_POST['message'] == "") |
A continuación, desinféctalos con la constante FILTER_SANITIZE_STRING.
1 |
$_POST['name'] = filter_var($_POST['name'], FILTER_SANITIZE_STRING); |
2 |
|
3 |
$_POST['message'] = filter_var($_POST['message'], FILTER_SANITIZE_STRING); |
Por último, asegúrate de que los dos campos sigan sin estar vacíos. Esto es para garantizar que no termines con un campo vacío después de eliminar todos los caracteres no permitidos:
1 |
if ($_POST['name'] == "") |
2 |
|
3 |
if ($_POST['message'] == "") |
No llevaremos a cabo ninguna validación de estos dos campos, simplemente debido a que no hay una forma absoluta de validar un nombre o un mensaje arbitrario.
El código final se ve así:
1 |
if ($_POST['name'] != "") { |
2 |
$_POST['name'] = filter_var($_POST['name'], FILTER_SANITIZE_STRING); |
3 |
if ($_POST['name'] == "") { |
4 |
$errors .= 'Please enter a valid name.<br/><br/>'; |
5 |
}
|
6 |
} else { |
7 |
$errors .= 'Please enter your name.<br/>'; |
8 |
}
|
9 |
|
10 |
if ($_POST['message'] != "") { |
11 |
$_POST['message'] = filter_var($_POST['message'], FILTER_SANITIZE_STRING); |
12 |
if ($_POST['message'] == "") { |
13 |
$errors .= 'Please enter a message to send.<br/>'; |
14 |
}
|
15 |
} else { |
16 |
$errors .= 'Please enter a message to send.<br/>'; |
17 |
}
|
Paso 4: valida el campo del correo electrónico
El campo del correo electrónico será desinfectado y validado de la misma forma en la que lo hicimos anteriormente en el tutorial.
Primero asegúrate de que no esté vacío:
1 |
if ($_POST['email'] != "") |
A continuación, desinféctalo:
1 |
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); |
Por último, valídalo para saber si es una dirección de correo electrónico verdadera:
1 |
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) |
El código final se ve así:
1 |
if ($_POST['email'] != "") { |
2 |
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); |
3 |
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { |
4 |
$errors .= "$email is <strong>NOT</strong> a valid email address.<br/><br/>"; |
5 |
}
|
6 |
} else { |
7 |
$errors .= 'Please enter your email address.<br/>'; |
8 |
}
|
Paso 5: valida el campo de la página web
Nuevamente, el campo de la página web será desinfectado y validado de la misma forma en la que lo hicimos anteriormente en el tutorial.
Primero asegúrate de que no esté vacío:
1 |
if ($_POST['homepage'] != "") |
Después desinféctalo y elimina los caracteres no permitidos:
1 |
$homepage = filter_var($_POST['homepage'], FILTER_SANITIZE_URL) |
Por último, valídalo para asegurarte de que sea un URL verdadero:
1 |
if (!filter_var($homepage, FILTER_VALIDATE_URL)) |
El código final se ve así:
1 |
if ($_POST['homepage'] != "") { |
2 |
$homepage = filter_var($_POST['homepage'], FILTER_SANITIZE_URL); |
3 |
if (!filter_var($homepage, FILTER_VALIDATE_URL)) { |
4 |
$errors .= "$homepage is <strong>NOT</strong> a valid URL.<br/><br/>"; |
5 |
}
|
6 |
} else { |
7 |
$errors .= 'Please enter your home page.<br/>'; |
8 |
}
|
Paso 6: revisa si hay errores y envía el mensaje
Ahora que ya hemos revisado todos los campos, es momento de informar de los errores o de enviar el mensaje. Comienza suponiendo que no hubieron errores:
1 |
if (!$errors) { |
Luego genera el mensaje de correo electrónico:
1 |
$mail_to = 'me@somewhere.com'; |
2 |
$subject = 'New Mail from Form Submission'; |
3 |
$message = 'From: ' . $_POST['name'] . "\n"; |
4 |
$message .= 'Email: ' . $_POST['email'] . "\n"; |
5 |
$message .= 'Homepage: ' . $_POST['homepage'] . "\n"; |
6 |
$message .= "Message:\n" . $_POST['message'] . "\n\n"; |
Y, por último, envía el mensaje:
1 |
mail($to, $subject, $message); |
Sin embargo, si hubieron errores, repórtalos y pide al usuario que lo intente de nuevo:
1 |
echo '<div style="color: red">' . $errors . '<br/></div>'; |
El proyecto terminado se ve así:
1 |
<?php
|
2 |
|
3 |
if (isset($_POST['Submit'])) { |
4 |
|
5 |
if ($_POST['name'] != "") { |
6 |
$_POST['name'] = filter_var($_POST['name'], FILTER_SANITIZE_STRING); |
7 |
if ($_POST['name'] == "") { |
8 |
$errors .= 'Please enter a valid name.<br/><br/>'; |
9 |
}
|
10 |
} else { |
11 |
$errors .= 'Please enter your name.<br/>'; |
12 |
}
|
13 |
|
14 |
if ($_POST['email'] != "") { |
15 |
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); |
16 |
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { |
17 |
$errors .= "$email is <strong>NOT</strong> a valid email address.<br/><br/>"; |
18 |
}
|
19 |
} else { |
20 |
$errors .= 'Please enter your email address.<br/>'; |
21 |
}
|
22 |
|
23 |
if ($_POST['homepage'] != "") { |
24 |
$homepage = filter_var($_POST['homepage'], FILTER_SANITIZE_URL); |
25 |
if (!filter_var($homepage, FILTER_VALIDATE_URL)) { |
26 |
$errors .= "$homepage is <strong>NOT</strong> a valid URL.<br/><br/>"; |
27 |
}
|
28 |
} else { |
29 |
$errors .= 'Please enter your home page.<br/>'; |
30 |
}
|
31 |
|
32 |
if ($_POST['message'] != "") { |
33 |
$_POST['message'] = filter_var($_POST['message'], FILTER_SANITIZE_STRING); |
34 |
if ($_POST['message'] == "") { |
35 |
$errors .= 'Please enter a message to send.<br/>'; |
36 |
}
|
37 |
} else { |
38 |
$errors .= 'Please enter a message to send.<br/>'; |
39 |
}
|
40 |
|
41 |
if (!$errors) { |
42 |
$mail_to = 'me@somewhere.com'; |
43 |
$subject = 'New Mail from Form Submission'; |
44 |
$message = 'From: ' . $_POST['name'] . "\n"; |
45 |
$message .= 'Email: ' . $_POST['email'] . "\n"; |
46 |
$message .= 'Homepage: ' . $_POST['homepage'] . "\n"; |
47 |
$message .= "Message:\n" . $_POST['message'] . "\n\n"; |
48 |
mail($to, $subject, $message); |
49 |
|
50 |
echo "Thank you for your email!<br/><br/>"; |
51 |
} else { |
52 |
echo '<div style="color: red">' . $errors . '<br/></div>'; |
53 |
}
|
54 |
}
|
55 |
?>
|
56 |
|
57 |
<form name="form1" method="post" action="form-email.php"> |
58 |
Name: <br/>
|
59 |
<input type="text" name="name" value="<?php echo $_POST['name']; ?>" size="50" /><br/><br/> |
60 |
Email Address: <br/>
|
61 |
<input type="text" name="email" value="<?php echo $_POST['email']; ?>" size="50"/> <br/><br/> |
62 |
Home Page: <br/>
|
63 |
<input type="text" name="homepage" value="<?php echo $_POST['homepage']; ?>" size="50" /> <br/><br/> |
64 |
Message: <br/>
|
65 |
<textarea name="message" rows="5" cols="50"><?php echo $_POST['message']; ?></textarea> |
66 |
<br/>
|
67 |
<input type="submit" name="Submit" /> |
68 |
</form>
|
Resumen
Espero que la lectura de este tutorial te haya proporcionado una buena introducción a las nuevas funciones de filtrado de datos de PHP. Todavía hay muchas funciones y reglas más que no fueron cubiertas, así que si estás interesado en aprender más, por favor revisa la sección Data Filtering (Filtrado de datos) en el manual de PHP.
- Suscríbete a la fuente RSS de NETTUTS para obtener más tutoriales y artículos diarios sobre desarrollo web.




