Validación de formulario PHP
Este y los siguientes capítulos muestran cómo usar PHP para validar datos de formularios.
Validación de formulario PHP
¡Piense en SEGURIDAD al procesar formularios PHP!
Estas páginas mostrarán cómo procesar formularios PHP teniendo en cuenta la seguridad. ¡La validación adecuada de los datos del formulario es importante para proteger su formulario de piratas informáticos y spammers!
El formulario HTML en el que trabajaremos en estos capítulos contiene varios campos de entrada: campos de texto obligatorios y opcionales, botones de radio y un botón de envío:
Las reglas de validación para el formulario anterior son las siguientes:
Field | Validation Rules |
---|---|
Name | Required. + Must only contain letters and whitespace |
Required. + Must contain a valid email address (with @ and .) | |
Website | Optional. If present, it must contain a valid URL |
Comment | Optional. Multi-line input field (textarea) |
Gender | Required. Must select one |
Primero veremos el código HTML simple para el formulario:
Campos de texto
Los campos de nombre, correo electrónico y sitio web son elementos de entrada de texto, y el campo de comentarios es un área de texto. El código HTML se ve así:
Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comment: <textarea name="comment" rows="5" cols="40"></textarea>
Botones de radio
Los campos de género son botones de radio y el código HTML se ve así:
Gender:
<input type="radio" name="gender"
value="female">Female
<input type="radio" name="gender" value="male">Male
<input type="radio" name="gender" value="other">Other
El elemento de forma
El código HTML del formulario se ve así:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Cuando se envía el formulario, los datos del formulario se envían con method="post".
¿Qué es la variable $_SERVER["PHP_SELF"]?
$_SERVER["PHP_SELF"] es una variable súper global que devuelve el nombre de archivo del script que se está ejecutando actualmente.
Entonces, $_SERVER["PHP_SELF"] envía los datos del formulario enviado a la página misma, en lugar de saltar a una página diferente. De esta forma, el usuario recibirá mensajes de error en la misma página que el formulario.
¿Qué es la función htmlspecialchars()?
La función htmlspecialchars() convierte los caracteres especiales en entidades HTML. Esto significa que reemplazará caracteres HTML como < y > con < y >. Esto evita que los atacantes exploten el código inyectando código HTML o Javascript (ataques de secuencias de comandos entre sitios) en los formularios.
Gran nota sobre la seguridad de los formularios PHP
¡Los piratas informáticos pueden usar la variable $_SERVER["PHP_SELF"]!
Si se usa PHP_SELF en su página, entonces un usuario puede ingresar una barra inclinada (/) y luego algunos comandos de Cross Site Scripting (XSS) para ejecutar.
Cross-site scripting (XSS) es un tipo de vulnerabilidad de seguridad informática que normalmente se encuentra en las aplicaciones web. XSS permite a los atacantes inyectar secuencias de comandos del lado del cliente en las páginas web vistas por otros usuarios.
Supongamos que tenemos el siguiente formulario en una página llamada "test_form.php":
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
Ahora, si un usuario ingresa la URL normal en la barra de direcciones como "http://www.example.com/test_form.php", el código anterior se traducirá a:
<form method="post" action="test_form.php">
Hasta ahora tan bueno.
Sin embargo, considere que un usuario ingresa la siguiente URL en la barra de direcciones:
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
En este caso, el código anterior se traducirá a:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
Este código agrega una etiqueta de secuencia de comandos y un comando de alerta. Y cuando se cargue la página, se ejecutará el código JavaScript (el usuario verá un cuadro de alerta). Este es solo un ejemplo simple e inofensivo de cómo se puede explotar la variable PHP_SELF.
Tenga en cuenta que se puede agregar cualquier código JavaScript dentro de la etiqueta <script>. Un pirata informático puede redirigir al usuario a un archivo en otro servidor, y ese archivo puede contener un código malicioso que puede alterar las variables globales o enviar el formulario a otra dirección para guardar los datos del usuario, por ejemplo.
¿Cómo evitar los exploits de $_SERVER["PHP_SELF"]?
Las vulnerabilidades de $_SERVER["PHP_SELF"] pueden evitarse utilizando la función htmlspecialchars().
El código del formulario debería verse así:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
La función htmlspecialchars() convierte los caracteres especiales en entidades HTML. Ahora, si el usuario intenta explotar la variable PHP_SELF, dará como resultado el siguiente resultado:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
¡El intento de explotación falla y no se produce ningún daño!
Validar datos de formulario con PHP
Lo primero que haremos será pasar todas las variables a través de la función htmlspecialchars() de PHP.
Cuando usamos la función htmlspecialchars(); luego, si un usuario intenta enviar lo siguiente en un campo de texto:
<script>ubicación.href('http://www.hacked.com')</script>
- esto no se ejecutaría, porque se guardaría como código HTML escapado, así:
<script>ubicación.href('http://www.hacked.com')</script>
Ahora es seguro mostrar el código en una página o dentro de un correo electrónico.
También haremos dos cosas más cuando el usuario envíe el formulario:
- Elimine los caracteres innecesarios (espacio adicional, tabulación, nueva línea) de los datos de entrada del usuario (con la función PHP trim())
- Elimine las barras invertidas (\) de los datos de entrada del usuario (con la función PHP stripslashes())
El siguiente paso es crear una función que haga todas las comprobaciones por nosotros (lo cual es mucho más conveniente que escribir el mismo código una y otra vez).
Nombraremos la función test_input().
Ahora, podemos verificar cada variable $_POST con la función test_input(), y el script se ve así:
Ejemplo
<?php
// define variables and set to empty values
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = test_input($_POST["name"]);
$email = test_input($_POST["email"]);
$website = test_input($_POST["website"]);
$comment = test_input($_POST["comment"]);
$gender = test_input($_POST["gender"]);
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
Tenga en cuenta que al comienzo del script, verificamos si el formulario se envió utilizando $_SERVER["REQUEST_METHOD"]. Si REQUEST_METHOD es POST, entonces el formulario ha sido enviado y debe ser validado. Si no se ha enviado, omita la validación y muestre un formulario en blanco.
Sin embargo, en el ejemplo anterior, todos los campos de entrada son opcionales. El script funciona bien incluso si el usuario no ingresa ningún dato.
El siguiente paso es hacer que los campos de entrada sean obligatorios y crear mensajes de error si es necesario.