Diseño Web. Desarrollo y Programación en Php.

Filtro simple AntiSpam en php, sin captcha

¿Cansado de recibir spam en tus formularios de consulta? Esta función te puede resultar útil.

Posteado el 17 de Abril de 2008

Ampliar

Nunca me gustaron demasiado los captcha. Los formularios ya son demasiado molestos en si mismos como para complicarlos más aún. Entonces estuve intentando hacer una función que detenga el spam, pero sin sumarle complejidad al formulario.

Básicamente, la lógica es la siguiente:

  1. Definimos en un array la lista de las palabras que generalmente vienen incluidas en los mensajes de spam que recibimos, podemos ir agregando o sacando palabras a medida que sea necesario para mejorar los resultados.
  2. Después, contamos las apariciones de dichas palabras en el texto del mensaje.
  3. Si las palabras aparecen muchas veces, sabemos que seguramente el mensaje es spam y entonces podremos optar por no enviarlo a la base de datos.

La función resultante es esta:

<?php
// Función para detectar spam
function esSpam($txt) {

$txt = strtolower($txt);
$spamWords = array ('[/url]',
'adderall', 'adipex', 'allegra', 'alprazolam', 'ambien',
'buy', 'bontril', 'buspar', 'butalbital',
'cheap', 'carisoprodol', 'celebrex', 'celexa', 'cialis', 'cipro', 'claritin', 'codeine',
'diazepam', 'diflucan',
'effexor', 'ephedra', 'ephedrine', 'evista',
'fioricet', 'flexeril', 'fosamax',
'hydrocodone',
'klonopin',
'lasix', 'levitra', 'lipitor', 'lorazepam', 'lortab',
'meridia',
'neurontin', 'nexium', 'norvasc',
'paxil', 'phentermine', 'plavix', 'prevacid', 'prilosec', 'propecia', 'prozac',
'ringtones',
'sex', 'singulair', 'soma',
'tramadol', 'tenuate', 'testosterone', 'tylenol',
'ultram',
'valium', 'valtrex', 'viagra', 'vicodin', 'vioxx',
'wellbutrin',
'xanax', 'xenical',
'zocor', 'zoloft', 'zyban', 'zyrtec' );

$spamCount = 0;
foreach ( $spamWords as $spamWord ) {
$spamCount = $spamCount + substr_count($txt, $spamWord);
}

return $spamCount;

}
?>

Luego la usamos más o menos así:

<?php
if (!empty($_POST['comentario']) && esSpam($_POST['comentario']) >= 10) {
echo "El mensaje fué interceptado por el filtro Anti-Spam y no ha sido enviado.";
exit();
}
?>

Cómo siempre, espero que les sea útil.

Saludos.
Pablo

Comentarios:

mara 2 de Septiembre de 2008 a las 11:11 hs

Hola me parece muy útil tener un script antispam, lo estuve probando pero no funciona , no se por qué. Te cuento como e el formulario : tiene un contacto.html y un enviar.php Le agregue la funcion al principio del codigo enviar.php y antes de la buncion mail le agregué el codigo para ejecutarla. y cambié post por get , ya que el formulario es por get. No se si estará bien eso.
Si podrias ayudarme te lo agradezco .
Bueno desde ya muchas gracias.saludos

Pablo Impallari 10 de Septiembre de 2008 a las 16:00 hs

Hola Mara:
Podes cambiar los post por gets tranquilamente, seguramente el problema es otro. Si queres enviame tus archivos y los reviso.

wagner 26 de Octubre de 2008 a las 00:51 hs

Quiero saber cómo se usa la parte el comentario, será de esta manera ?
$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
$editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
$insertSQL = sprintf("INSERT INTO comentarios (nombre, apellido, correo, pais, comentario) VALUES (%s, %s, %s, %s, %s)",
GetSQLValueString($_POST['nombre'], "text"),
GetSQLValueString($_POST['apellido'], "text"),
GetSQLValueString($_POST['correo'], "text"),
GetSQLValueString($_POST['pais'], "text"),
if (!empty($_POST['comentario']) && esSpam($_POST['comentario']) >= 20) {
GetSQLValueString($_POST['comentario'], "text");
echo "El mensaje fué interceptado por el filtro Anti-Spam y no ha sido enviado.";
exit();
}
mysql_select_db($database_vConeccionPadrinos, $vConeccionPadrinos);
$Result1 = mysql_query($insertSQL, $vConeccionPadrinos) or die(mysql_error());
}
?>

Pablo Impallari 26 de Octubre de 2008 a las 18:04 hs

Sep, tal cual.

Wagner 16 de Noviembre de 2008 a las 23:10 hs

Quiero saber si puedo implementarlo de esta manera:

$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
$editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "frmcomentario")) {
$insertSQL = sprintf("INSERT INTO comentarios (nombre, apellido, correo, pais, comentario) VALUES (%s, %s, %s, %s, %s)",
GetSQLValueString($_POST['nombre'], "text"),
GetSQLValueString($_POST['apellido'], "text"),
GetSQLValueString($_POST['correo'], "text"),
GetSQLValueString($_POST['pais'], "text"),


?> if (!empty(GetSQLValueString($_POST['comentario'], "text"))) && esSpam(GetSQLValueString($_POST['comentario'], "text"))) >= 10)
{
echo "El mensaje fué interceptado por el filtro Anti-Spam y no ha sido enviado.";
exit();
}
else
{
GetSQLValueString($_POST['comentario'], "text"));
}

Martin 7 de Abril de 2009 a las 10:16 hs

Hola pablo! tu solucion es verdaderamente original y prática..!! ahora me pongo a probar! muchisimas gracias por el aporte.. saludos

Gabriela 10 de Julio de 2009 a las 22:14 hs

Hola Pablo, me parece excelente la funcion que implementaste, de hecho la estoy implentando en estos momentos pero me surgió una duda, cuano hablas de "comentario" es el asunto del mensaje como tal?

Pablo Impallari 16 de Julio de 2009 a las 00:20 hs

@Gabriela:
Nop, el comentario es el campo donde escriben el mensaje, que es lo que vas a comparar contra el array de spamWords.

sysmaya 23 de Diciembre de 2009 a las 18:19 hs

Eselente script, senxillo, y potente. es cuestion de agregar unas palabras mas, como bulgaridades, y palabrotas.

y mil vezes mejor que usar un captcha, u otros metodos que "espantan" a los usuarios.

Lo he implementado en mi sitio para filtrar la ya creciente oferta de pastillas y medicamentos.

GraciaZ.
PD: los errores de hortografia son un bug del teclado. ;(

galax 9 de Abril de 2010 a las 00:43 hs

la verdad nose como lo hacen pero tengo un formulario con captcha y nada me filtran nose por donde pero logran vulnerar esta condision jejee pueden verlo aqui...
me toca eliminarlo manual mente por sql en la db... ):- yo me pregunto como lo hacen el robot jejeje.

http://ecaes.tusimulacro.com/coment/index.php

Luis 11 de Julio de 2010 a las 14:29 hs

Hola Pablo, buscando por Internet he coincidido con tu página, la verdad me gusta este sistema para combatir el spam. Estoy de acuerdo contigo, no me gustan los captchas, me desagrada cuando he tenido que entrar en algún lugar y tener que repetir la interpretación por equivocarme...
He intentado introducir el script en php, todas las variaciones realizadas han sido infructuosas, relleno el formulario y el contenido se inserta en la web nada lo detiene.
Si puedes y quieres te agradecería tu ayuda, y si puedo corresponderte con otra cosa lo haré gustosamente.

Muchas gracias y disculpa por las molestias.


Saludos de Luis García

Envia tu comentario:





Servicios:

Nuestros Clientes:

Consultanos ahora!

Valid XHTML 1.0 Strict
XHTML 1.0 Strict

PabloImpallari

Diseño Web. Desarrollo y Programación en Php.

Tel: (+54) (0341) 4567218.

Cordoba 6345. Rosario, Argentina.