PHP Validación de formularios
En este capítulo aprenderemos cómo usar PHP para validar los datos de formulario enviados por el cliente.
Validación de formularios PHP
![]() |
Al procesar formularios PHP, debemos tener en cuenta la seguridad.
En este capítulo mostraremos el manejo seguro de los datos de formularios PHP. Para prevenir hackers y spam, necesitamos realizar una validación de seguridad de los datos del formulario. |
|---|
El formulario HTML presentado en este capítulo contiene los siguientes campos de entrada: campos de texto obligatorios y opcionales, botones de radio y botón de enviar:
Las reglas de validación del formulario anterior son las siguientes:
| Campo | Reglas de validación |
|---|---|
| Nombre | Obligatorio. + Solo puede contener letras y espacios. |
| Obligatorio. + Debe ser una dirección de correo electrónico válida (que contenga '@' y '.'). | |
| URL | Opcional. Si existe, debe contener una URL válida. |
| Observaciones | Opcional. Campo de entrada de varias líneas (área de texto). |
| Género | Obligatorio. Debe seleccionar uno. |
Primero veamos el código HTML puro del formulario:
Campo de texto
Los campos 'Nombre', 'E-mail' y 'URL' son elementos de entrada de texto; el campo 'Observaciones' es un textarea. El código HTML se muestra a continuación:
“名字”: <input type="text" name="name"> E-mail: <input type="text" name="email"> 网址: <input type="text" name="website"> 备注: <textarea name="comment" rows="5" cols="40"></textarea>
Botones de radio
El campo 'Género' es un botón de radio. El código HTML se muestra a continuación:
性别: <input type="radio" name="gender" value="female">女 <input type="radio" name="gender" value="male">男
Elementos de formulario
El código del formulario HTML es el siguiente:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Este formulario utilizamethod="post"el método para enviar los datos.
![]() |
¿Qué es la variable $_SERVER["PHP_SELF"]? $_SERVER["PHP_SELF"] es una variable superglobal que devuelve el nombre del archivo del script que se está ejecutando actualmente, relativo a la raíz del documento (document root). |
|---|
Por lo tanto, $_SERVER["PHP_SELF"] envía los datos del formulario a la página actual, en lugar de saltar a una página diferente.
![]() |
¿Qué es la función htmlspecialchars()? La función htmlspecialchars() convierte algunos caracteres predefinidos en entidades HTML. Los caracteres predefinidos son:
|
|---|
¿Qué aspectos requieren atención en los formularios PHP?
¡La variable $_SERVER["PHP_SELF"] puede ser utilizada por hackers!
Cuando un hacker ataca utilizando enlaces HTTP de cross-site scripting, la variable de servidor $_SERVER["PHP_SELF"] también puede ser infectada con un script. La razón es que el cross-site scripting se adjunta a la ruta del archivo en ejecución, por lo que la cadena de $_SERVER["PHP_SELF"] contendrá el código JavaScript que sigue al enlace HTTP.
![]() |
XSS también se llama CSS (Cross-Site Script), ataque de secuencias de comandos entre sitios. Un atacante malicioso inserta código HTML malicioso en la página web. Cuando el usuario navega por esa página, el código HTML incrustado en la web se ejecuta, logrando así el propósito especial del usuario malicioso. |
|---|
Especifique el nombre del siguiente archivo de formulario como "test_form.php":
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
Ahora, usamos la URL para especificar la dirección de envío "test_form.php". El código anterior se modifica de la siguiente manera:
<form method="post" action="test_form.php">
Esto ya está bien.
Sin embargo, considere que el usuario puede ingresar la siguiente dirección en la barra de direcciones del navegador:
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
En la URL anterior, se analizará como el siguiente código y se ejecutará:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
Se agregó una etiqueta script y un comando alert. Cuando la página se carga, se ejecutará este código JavaScript (el usuario verá un cuadro emergente). Esto es solo un ejemplo sencillo para ilustrar que la variable PHP_SELF puede ser explotada por hackers.
Tenga en cuenta que,¡Cualquier código JavaScript puede añadirse en la etiqueta <script>!Los hackers pueden aprovechar esto para redirigir la página a una página en otro servidor. El archivo de código de la página puede contener código malicioso, el cual puede modificar variables globales u obtener los datos del formulario del usuario.
¿Cómo evitar que $_SERVER["PHP_SELF"] sea explotado?
Se puede evitar que $_SERVER["PHP_SELF"] sea explotado mediante la función htmlspecialchars().
El código del formulario se muestra a continuación:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
htmlspecialchars() convierte algunos caracteres predefinidos en entidades HTML. Ahora, si el usuario intenta explotar la variable PHP_SELF, el resultado se mostrará así:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
¡El intento de explotar la vulnerabilidad falla!
Validar datos de formulario con PHP
Primero, procesamos todos los datos enviados por el usuario con la función htmlspecialchars() de PHP.
Cuando usamos la función htmlspecialchars(), si el usuario intenta enviar el siguiente campo de texto:
<script>location.href('http://www.example.com')</script>
El código no se ejecutará, ya que se guardará como código de escape HTML, como se muestra a continuación:
<script>location.href('http://www.example.com')</script>
El código anterior es seguro y puede mostrarse normalmente en la página o insertarse en un correo electrónico.
Cuando el usuario envía el formulario, haremos las siguientes dos cosas:
- Usar la función trim() de PHP para eliminar caracteres innecesarios de los datos ingresados por el usuario (como espacios, tabulaciones, saltos de línea).
- Usar la función stripslashes() de PHP para eliminar las barras invertidas (\) de los datos ingresados por el usuario.
A continuación, escribamos estas funciones de filtrado en una función definida por nosotros mismos, lo que puede mejorar en gran medida la reutilización del código.
Nombre la función test_input().
Ahora, podemos usar la función test_input() para comprobar todas las variables en $_POST. El código del script es el siguiente:
Ejemplo
Ejecutar ejemplo »
Tenga en cuenta que al ejecutar el script anterior, se detecta si el formulario ha sido enviado mediante $_SERVER["REQUEST_METHOD"]. Si REQUEST_METHOD es POST, el formulario se envía y los datos se validan. Si el formulario no se envía, se omite la validación y se muestran campos en blanco.
En el ejemplo anterior, todos los campos de entrada son opcionales, por lo que la página se muestra correctamente incluso si el usuario no ingresa ningún dato.
En los próximos capítulos presentaremos cómo validar los datos ingresados por el usuario.
Otras extensiones