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.
Escrito por manuel el Sunday 12 de November 2006
Guardado en Programacion PHP





Friday 11 de January de 2008 a las 4:40 pm
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);
?>
Friday 11 de January de 2008 a las 4:46 pm
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.