Diseño Web. Desarrollo y Programación en Php.
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:
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
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
XHTML 1.0 Strict
PabloImpallari
Diseño Web. Desarrollo y Programación en Php.
Tel: (+54) (0341) 4567218.
Cordoba 6345. Rosario, Argentina.