La protección de los formularios: Esencial.

Los formularios que se integran en las páginas webs ¿son del todo seguros? ¿Qué cosas se deben tener en cuenta? 

Fuente: http://www.flickr.com/photos/mellis/
Fuente: http://www.flickr.com/photos/mellis/

Los formularios se emplean para registrar usuarios o incluso para permitir a los visitantes solicitar información, o para realizar busquedas y se pueden programar en muchos lenguajes, aunque en AGENCIA LA NAVE empleamos en el 90% de los casos el PHP.

Detectar el tráfico humano es cada día más importante para evitar tener (1) usuarios falsos (2) duplicidad de registros de un mismo usuario (3) fraudes en las cuentas (4) envío de spam en formularios (5) otros ataques que pueden llegar a ser más graves.

El problema es encontrar el equilibrio en los formularios: Si por ejemplo pedimos que el usuario tenga que escribir un “captcha” para confirmar su registro haremos que su registro sea más difícil (problemas de visión etc) y habrá que ver si es en ese formulario indispensable su uso.

Fuente: http://www.google.com/recaptcha
Fuente: http://www.google.com/recaptcha

En las programaciones uno de los sistemas más potentes los ofrece reCaptcha de forma gratuita al ser un servicio de Google que solicitando una “key” identificadora no establece “de momento” limites de uso.

paso # 1: obtener la librería recaptcha

La librería se puede descargar sin coste alguno aunque requiere de registrarse para evitar un abuso en el uso de la misma ya que consume recursos a Google que lo mantiene sin pedir nada a cambio.

paso # 2: descargar e instalar recaptcha php

Una vez descargada la librería debemos descomprimirla en la carpeta dónde queramos tener el formulario. Usaremos wget para su descarga en el sistema si tenemos acceso SSH al servidor o la descargaremos en nuestro PC y la subiremos por FTP o SFTP al hospedaje. Si lo hacemos por SSH deberemos usar unzip para extraer el contenido del mismo y si lo hacemos en PC usaremos un descompresor como el Winrar o el Winzip.

paso # 3: probar y verificar

Ahora realizaremos el formulario a nivel práctico sin pensar en el diseño en sí, solo en la programación y en como utilizar la librería descargada:

<html><head>
        <title>Formulario Simple de Correo Agencia La Nave</title>
</head><body>
<script>
    function checkForm() {
        if (document.forms.formulario.elements['nombre'].value.length == 0) {
                alert('Por favor ingrese un valor para el campo "Nombre"');
                return false;
        }
        if (document.forms.formulario.elements['email'].value.length == 0) {
                alert('Por favor ingrese un valor para el campo "Email"');
                return false;
        }
        if (document.forms.formulario.elements['mensaje'].value.length == 0) {
                alert('Por favor ingrese un valor para el campo mensaje "Mensaje"');
                return false;
        }
        return true;
   }
</script>
<form action="?done=1" method="post" name="formulario" onSubmit="return checkForm()"  >
<table border=0>
<tr><td>Su Nombre:</td>
<td>
<input type="text" name="nombre" size="50" maxlength="50" value="" /></td>
</tr><tr>
<td>Su Email:</td>
<td>
<input type="text" name="email" size="50" maxlength="50" value="" /></td>
</tr><tr>
<td>Mensaje:</td>
<td>
<input type="text" name="mensaje" size="50" maxlength="50" value="" /></td>
</tr><tr>
<td>¿Es usted un humano?</td><td>
<?php

@require_once('recaptchalib.php');
// aquí se ponen las keys solicitadas
$publickey = "YOUR-PUBLIC-KEY";
$privatekey = "YOUR-PRIVATE-KEY";
$resp = null; $error = null; 
if ($_POST["submit"]) { 
$resp = recaptcha_check_answer ($privatekey, $_SERVER["REMOTE_ADDR"], $_POST["recaptcha_challenge_field"], $_POST["recaptcha_response_field"]); 

if ($resp->is_valid) { 
$to="usted@sudominio"; 
$subject="Titulo de ejemplo";
$body=" Mensaje formulario: Nombre: " .$_POST["nombre"] . "\n Email: " .$_POST["email"] . "\n Mensaje: " .$_POST["mensaje"] . "\n"; 
/* enviando correo */ 
mail($to,$subject,$body); 
echo "Correo Enviado!"; 
exit(1); 
} else { 
echo "Lo sentimos pero no ha colocado el texto correctamente! Intente nuevamente..."; } 

} 
echo recaptcha_get_html($publickey, $error); ?>   
<input type="submit" name="submit" value="Enviar" />

Existen otras plataformas de captcha como Solvemedia que además se están especializando en evitar el fraude en las campañas publicitarias en la red. El sistema captcha al final es la típica imagen distorsionada, el cual no le gusta al usuario usuario, ya que le obligar al usuario a utilizar un campo más de un formulario, lo que puede hacer perder un posible usuario en ciertos casos.

realtraffic
Por eso a veces no queremos introducir captcha en nuestra web para no dificultar que se envíe un correo y se utilizan técnicas muy curiosas con cierta validación de seguridad:

  • Realizar comprobaciones de los datos en el lado del cliente y en el lado de servidor.  Obviamente, solemos realizar las comprobaciones Javascript en el lado del cliente para que el “usuario normal” no introduzca datos erróneos en la Pagina1. Los robots se saltan esta limitación, asi que debemos comprobar en el servidor, que todos los datos tienen el formato correcto, en la Pagina2.
  • Controlar la sesión del usuario.Controlar mediante sesiones, que el usuario que entra en la Pagina2 (del formulario) viene exclusivamente de la Pagina1 (la raíz dónde enlaza al formulario). Es decir, tenemos una variable que guardamos en la sesion del usuario, por ejemplo, con valor 1, y cuando leamos esa variable en Pagina2, pues si tiene ese valor es que viene de Pagina1, y modificamos su valor para que tenga que volver a pasar por el formulario.  Esta claro que un hacker podría simular las cookies por lo que todo es ponerlo algo más difícil.
  • Introducir un campo oculto por css con nombre emailIntroducir un campo cuyo nombre contenga la palabra “email”, y ocultarlo con estilos(style=”display:none”). En el value del campo, introducimos un valor que no sea un email, ya que está comprobado que los robots rellenan con un email aleatorio todos los campos que encuentran con ese nombre. De esta forma, en Pagina fínal, podemos comprobar que ese campo que nos llega no tenga formato de email. En definitiva puede venir genial que el campo del correo se llame de forma poco habitual y rara y el “hidden” casualmente sea “email” para que solo el usuario real pueda saber que debe rellenar.
    <input type=”text” name=”emailmentiroso” value=”A” style=”display:none”>
    Gracias al HTML y los CSS podemos proteger mejor nuestro código.
  • Introducir un campo oculto en el formulario con la una clave dinámica y encriptada (para que no sepa el bot como debe rellenarla).Podremos poner en el formulario, un campo “hidden” cuyo valor sea una clave encriptada que nosotros sabemos. Si esta clave es dinámica, pues mucho mejor porque al cambiar el cliente no sabrá cual debe ser. En cualquier caso se debe añadir un JAVASCRIPT que genere uno o más campos HIDDEN y obligatorios que realicen una operación sobre los parámetros normales introducidos de forma que si no llegan codificados de forma correcta no se acepten y se ignore el formulario.Se puede incluso hacer que alguno de los campos use un dato obtenido por el navegador como por ejemplo coger el AÑO multiplicarlo por 3 y sumarle 234 y ese que sea el parámetro y que dicho algoritmo cambie día a día. ¡Todo es inventiva!

Desde luego los formularios requieren de profesionales que piensen todo y ya no vale con la estética sino que sepan lo importante que es la seguridad para evitar un uso no autorizado de nuestros recursos de la web.

En AGENCIA LA NAVE disponemos de expertos capaces de programar de forma eficiente dicho código y no solo eso, sino de implementar soluciones muy innovadoras de validación por teléfono.

Y es que a veces un mal formulario puede provocar la caída completa de una web mediante un DDOS. Por ejemplo cuando el PHP en sí del formulario accede a una base de datos en MYSQL.

Siempre antes de cargar cualquier PHP se debe comprobar si puede ser un tráfico no humano (BOT) analizando si es habitual el acceso: IP / tiempo de último acceso / número de accesos desde esa misma IP y así DENEGAR con un simple EXIT el acceso al recurso en caso de sospechas antes de permitir que un hacker ejecutando miles de procesos cargando un mismo formulario pueda abrir tantos MYSQL que cuelgue el servidor. (Denegación de servicio)

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *