23-Validacion de formularios en php

La validación adecuada de los datos del formulario es importante para proteger su formulario de piratas informáticos y spammers!

PHP Form Validation Example

* Campo requerido

Name: *

E-mail: *

Website:

Comment:

Gender: Female Male Other *


...

Las reglas de validación para el formulario anterior son las siguientes:

Campo Validacion
name Requerido. + Solo debe contener letras y espacios en blanco
email Requerido. + Debe contener una dirección de correo electrónico válida (con @ y .)
website Opcional. Si está presente, debe contener una URL válida
comment Opcional. Campo de entrada de varias líneas (área de texto)
Gender Requerido. Debe seleccionar uno

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 comentario campo es un área de texto. El código HTML se ve así:

Name: 
E-mail: 
Website: 
Comment: 

Botones de radio

Los campos de género son botones de radio y el código HTML se ve así:

Gender:
Female
Male
Other

El formulario

el elemento del formulario su codigo es asi:

<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"]?

La variable super global $_SERVER["PHP_SELF"] devuelve el nombre de archivo del script actualmente en ejecución.

Desta forma los datos seran enviados a la misma pagina que estamos trabajando

Otra forma de tener el mismo resultado es desjar el elemento action entre comillas en blanco

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 Cross-site Scripting) en formularios.

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 Cross Site Scripting (XSS) para ejecutar.

Cross-site scripting (XSS) es un tipo de vulnerabilidad de seguridad informática normalmente se encuentran en las aplicaciones web. XSS permite a los atacantes inyectar en el lado del cliente script en páginas web vistas por otros usuarios.

ejemplo

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 aquí todo bien.

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 carga la página, el Se ejecutará el código JavaScript (el usuario verá un cuadro de alerta). Esto es solo un simple e inofensivo ejemplo de cómo se puede explotar la variable PHP_SELF.

Tenga en cuenta que se puede agregar cualquier código JavaScript dentro del etiqueta <script>! Un hacker puede redirigir al usuario a un archivo en otro servidor, y ese archivo puede contener código malicioso que puede alterar las variables globales o enviar el formulario a otro 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 bien, 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. (que es mucho más conveniente que escribir el mismo código una y otra vez).

Nombraremos la función test_input().

Ahora podemos verifique cada variable $_POST con la función test_input(), y el script se ve así:

<?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 ha sido enviado usando $_SERVER["REQUEST_METHOD"]. Si REQUEST_METHOD es POST, entonces el formulario ha sido enviado - y debe ser validado. Si no ha sido enviado, omita la validación y mostrar un formulario en blanco.

Sin embargo, en el ejemplo anterior, todos los campos de entrada son opcionales. La secuencia de comandos funciona bien incluso si el usuario no ingresa ningún dato.





Publicar un comentario

0 Comentarios