Evitar que usen nuestros formularios para Spam

Últimamente todos los que programamos en PHP y no hemos sido muy precavidos, nos estamos encontrando con constantes ataques (o intentos) de spammers, que intentan usar nuestros formularios para aumentar sus ventas de viagra ;).
Oscar desde surlandia nos ilustra sobre el tema con su artículo: «Evitar spam en formularios PHP«. Altamente recomendable.

Publicado por

manuel

Me dedico al desarrollo de aplicaciones. Principalmente trabajo con XHTML, CSS, Javascript, XML, JSON, PHP, MySQL, Linux/MacOS X y Flash actionscript. Intento siempre trabajar con estándares y simplificar el desarrollo y las aplicaciones finales con el objetivo de orientarlas al usuario (que sean útiles y faciliten el trabajo).

2 comentarios en «Evitar que usen nuestros formularios para Spam»

  1. Aparte de la validación javascript antes de enviar el formulario, Para evitar que los hackers inserten código no deseado hagan sql o email injection también es recomendable hacer una validacion en el lado del servidor. Recomiendo usar una función como esta:

    <?php
    function ValidarDatos($campo){
    //Array con las posibles cadenas a utilizar por un hacker
    $CadenasProhibidas = array(«Content-Type:»,
    «MIME-Version:», //evita email injection
    «Content-Transfer-Encoding:»,
    «Return-path:»,
    «Subject:»,
    «From:»,
    «Envelope-to:»,
    «To:»,
    «bcc:»,
    «cc:»,
    «UNION», // evita sql injection
    «DELETE»,
    «DROP»,
    «SELECT»,
    «INSERT»,
    «UPDATE»,
    «CRERATE»,
    «TRUNCATE»,
    «ALTER»,
    «INTO»,
    «DISTINCT»,
    «GROUP BY»,
    «WHERE»,
    «RENAME»,
    «DEFINE»,
    «UNDEFINE»,
    «PROMPT»,
    «ACCEPT»,
    «VIEW»,
    «COUNT»,
    «HAVING»,
    «‘»,
    ‘»‘,
    «{«,
    «}»,
    «[«,
    «]»,
    «HOTMAIL», // evita introducir direcciones web
    «WWW»,
    «.COM»,
    «@»,
    «W W W»,
    «. c o m»,
    «http://»,
    «$», //variables y comodines
    «&»,
    «*»
    );
    //Comprobamos que entre los datos no se encuentre alguna de
    //las cadenas del array. Si se encuentra alguna cadena se
    //dirige a una página de Forbidden

    foreach($CadenasProhibidas as $valor){
    if(strpos(strtolower($campo), strtolower($valor)) !== false){
    echo(»
    alert(‘No puede introducir direcciones web, comillas, corchetes, código de programación o cualquier dato no relativo a los campos del formulario’);
    history.back();»);
    exit;
    }
    }
    }

    //Asignamos la variable POST y llamada a la función Validardatos($texto)
    $texto= $_POST[«texto»];
    ValidarDatos($texto);
    ?>

  2. Hola jonaytom,

    me parece que la solución que propones es demasiado restrictiva.
    Realmente lo único que necesita ser filtrado son las cabeceras del mensaje. Todo depende del caso.

    Se puede arreglar con un simple:

    $from = strtr($_POST[‘from’],»\r\n\t»,’???’);

    para filtrar los campos que irán en la cabecera (from, to, subject, reply-to, etc.).

    Recomiendo el uso de la clase Zend_Mail que trae el Zend Framework, que ya trae de serie mecanismos para evitar este tipo de ataques.

Deja una respuesta

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