En este capítulo presentaremos cómo usar PHP para verificar los datos del formulario enviado por el cliente.
Necesitamos considerar la seguridad cuando trabajamos con formularios PHP. En este capítulo demostraremos el procesamiento seguro de los datos del formulario PHP. Para evitar piratas informáticos y spam, debemos realizar una verificación de seguridad de los datos en el formulario. |
El formulario HTML descrito en este capítulo contiene los siguientes campos de entrada: campos de texto obligatorios y opcionales, botones de opción y botones de envío:
Las reglas de validación de formularios anteriores son las siguientes:
Campo | Reglas de validación |
---|---|
nombre | debe. +solo puede contener letras y espacios |
Correo electrónico | debe. + debe ser una dirección de correo electrónico válida (contiene '@' y '.') |
URL | Opcional. Si está presente, debe contener una URL válida. |
Observación | Opcional. Campos de entrada de varias líneas (campos de texto) |
género | debe. debe elegir uno |
Primero, echemos un vistazo al código del formulario HTML puro:
Los campos "Nombre", "Correo electrónico" y "Sitio web" son elementos de entrada de texto y el campo "Observaciones" es un área de texto. El código HTML se ve así:
"Nombre": <input type="text" name="name">Correo electrónico: <input type="text" name="email">Sitio web: <input type="text" name="website">Observaciones : <textarea nombre="comentario" filas="5" cols="40"></textarea>
El campo "Género" es un botón de opción y el código HTML se ve así:
Género:<input type="radio" name="gender" value="female">Mujer<input type="radio" name="gender" value="male">Hombre
El código del formulario HTML se ve así:
<form método="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
El formulario utiliza el método método = "post" para enviar datos.
¿Qué es la variable $_SERVER["PHP_SELF"]? $_SERVER["PHP_SELF"] es una variable súper global que devuelve el nombre del archivo del script que se está ejecutando actualmente y está relacionada con la raíz del documento. |
Por lo tanto, $_SERVER["PHP_SELF"] enviará los datos del formulario a la página actual en lugar de saltar a una página diferente.
¿Qué es el método htmlspecialchars()? La función htmlspecialchars() convierte algunos caracteres predefinidos en entidades HTML. Los caracteres predefinidos son: & (ampersand) se convierte en & " (comillas dobles) se convierte en " ' (comilla simple) se convierte en ' < (menor que) se convierte en < > (mayor que) convertirse en> |
¡Los piratas informáticos pueden utilizar la variable $_SERVER["PHP_SELF"]!
Cuando los piratas informáticos utilizan enlaces HTTP de secuencias de comandos entre sitios para atacar, la variable del servidor $_SERVER["PHP_SELF"] también se incrustará en la secuencia de comandos. La razón es que las secuencias de comandos entre sitios se agregan a la ruta del archivo ejecutable, por lo que la cadena $_SERVER["PHP_SELF"] contendrá el código del programa JavaScript detrás del enlace HTTP.
XSS también se llama CSS (Cross-Site Script), un ataque de secuencias de comandos entre sitios. Los atacantes malintencionados insertan código HTML malicioso en una página web. Cuando un usuario navega por la página, se ejecutará el código HTML incrustado en la página web, logrando así el propósito especial del usuario malintencionado. |
Especifique el siguiente nombre de archivo de formulario "test_form.php":
<form método="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
Ahora usamos la URL para especificar la dirección de envío "test_form.php" y el código anterior se modifica de la siguiente manera:
<método de formulario="publicar" acción="test_form.php">
Eso estaría bien.
Sin embargo, considere que el usuario ingresará la siguiente dirección en la barra de direcciones del navegador:
http://www.codercto.com/test_form.php/%22%3E%3Cscript%3Ealert('pirateado')%3C/script%3E
La URL anterior se analizará en el siguiente código y se ejecutará:
<form método="post" action="test_form.php/"><script>alerta('pirateado')</script>
Se agregó una etiqueta de secuencia de comandos al código y se agregó un comando de alerta. Este código Javascript se ejecutará cuando se cargue la página (el usuario verá un cuadro emergente). Este es solo un ejemplo simple de cómo los piratas informáticos pueden explotar la variable PHP_SELF.
¡Tenga en cuenta que se puede agregar cualquier código JavaScript dentro de la etiqueta <script>! Los piratas informáticos pueden usar esto para redirigir la página a una página en otro servidor. El archivo de código de la página puede proteger el código malicioso. El código puede modificar variables globales u obtener los datos del formulario del usuario.
$_SERVER["PHP_SELF"] se puede evitar utilizando la función htmlspecialchars().
El código del formulario se ve así:
<form método="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
htmlspecialchars() convierte algunos caracteres predefinidos en entidades HTML. Ahora, si el usuario desea utilizar la variable PHP_SELF, el resultado será el siguiente:
<form método="post" action="test_form.php/"><script>alert('pirateado')</script>">
¡El intento de explotar este exploit falló!
Primero, procesamos todos los datos enviados por los usuarios a través de la función htmlspecialchars() de PHP.
Cuando utilizamos la función htmlspecialchars(), el usuario intenta enviar el siguiente campo de texto:
<script>ubicación.href('http://www.codercto.com')</script>
Este código no se ejecutará ya que se guardará como código de escape HTML como este:
<script>ubicación.href('http://www.codercto.com')</script>
El código anterior es seguro y puede mostrarse normalmente en la página o insertarse en correos electrónicos.
Cuando el usuario envíe el formulario, haremos las dos cosas siguientes:
Utilice la función PHP trim() para eliminar caracteres innecesarios (como espacios, tabulaciones, nuevas líneas) en los datos de entrada del usuario.
Utilice la función PHP stripslashes() para eliminar barras invertidas () de los datos de entrada del usuario
A continuación, escribamos estas funciones de filtrado en una función que definimos nosotros mismos, lo que puede mejorar en gran medida la reutilización del código.
Nombra la función test_input().
Ahora, podemos usar la función test_input() para detectar todas las variables en $_POST. El código del script es el siguiente:
<?php//Defina variables y configúrelas con valores vacíos de forma predeterminada $nombre= $correo electrónico= $género= $comentario= $sitio web= "" if($_SERVER["REQUEST_METHOD"]== "POST") { $nombre= test_input($_POST["nombre"]); $correo electrónico= test_input($_POST["correo electrónico"]); test_input($_POST["sitio web"]); $comentario= test_input($_POST["comentario"]); $género= test_input($_POST["género"]);} funcióntest_input($datos){ $datos= recorte ($datos); $datos= stripslashes($datos); $datos= htmlspecialchars($datos);
Tenga en cuenta que cuando ejecutamos el script anterior, usaremos $_SERVER["REQUEST_METHOD"] para detectar si el formulario se ha enviado. Si REQUEST_METHOD es POST, se enviará el formulario y se validarán los datos. Si no se envía el formulario, la validación se omitirá y se mostrará en blanco.
El uso de elementos de entrada en los ejemplos anteriores es opcional y se puede mostrar normalmente incluso si el usuario no ingresa ningún dato.
En el próximo capítulo presentaremos cómo validar los datos ingresados por el usuario.