Foros del Web » Programando para Internet » PHP »

Aporte: Sistema Anti-Spam

Estas en el tema de Aporte: Sistema Anti-Spam en el foro de PHP en Foros del Web. Hola Comunidad: Les presento una clase para evitar el spam en nuestros formularios web sin usar captcha. Hay muchas personas tienen dificultades visuales y un ...
  #1 (permalink)  
Antiguo 13/04/2008, 09:51
(Desactivado)
 
Fecha de Ingreso: diciembre-2006
Mensajes: 529
Antigüedad: 17 años, 4 meses
Puntos: 11
Aporte: Sistema Anti-Spam

Hola Comunidad:

Les presento una clase para evitar el spam en nuestros formularios web sin usar captcha.
Hay muchas personas tienen dificultades visuales y un captcha le complica las cosas.
Esta clase entrega un karma al formulario e indica de acuerdo a ese índice si es spam o no.

antispam.class.php
Código PHP:
<?php
 
class antispam
{
   var 
$tolerancia=2;
   var 
$totalPalabras=0;
   var 
$puntos=0;
   var 
$listOut '/(
href|fast|accurate|expen|free|excite|increase|brochure|magazine|energy|loan|mortgage|classif|income|incomi|debt|affiliat|afford|insurance|member|bachelor|opportunit|winner|congrat|horny|viagra|víagra|vìagra|viagr@|vi@gra|v1agra|porn|slut|wom|leverage|investment|instantly|cash|muscle|lotto|finance|dollar|millionaire|buck|gambl|advertise|currency|prosperity|prosperous|invitation|reward|bigger|better|purchase|prescription|pharmacy|poker|penis|approve|enlarge|promotions|congress|coupon|bulk|girlz|goddess|webcam|livecam|camera|auction|chick|fuck|cock|pleasure|remedy|hormone|therapy|remove|dismiss|asian|mailerdirect|forfree|freehost|sexserver|orgasm|cheap|discount|vioxx|xanax|zolus|levitra|levitra |enlarge|chatroom|booker|credit-card-debt|discreetordering|paxil|xxx|v i a g r a)/'
;
 
 
function 
antispam($tolerancia) {
 
$this->tolerancia=(int)$tolerancia;
}
 
function 
ControlUrl($dominio,$url) {
 
$longitudDominio strlen($dominio);
 
$urlRecomendada substr($url,0,$longitudDominio);
 
 if (
$urlRecomendada == $dominio)
 return 
true;
 else
 return 
false;
}
function 
textCleaner($text) { 
 
 
$text strip_tags$text );
 return 
$text;
}
function 
controlPalabras($text) {
 
 if(
$coin preg_match_all($this->listOut,$text,$coincidencias))
 
$this->puntos += $coin;
 
$this->totalPalabras += str_word_count($text,0,'/-_@:."$%&()=?¡¿!#{}[]+-*><');
 
}
 
function 
karma() {
if (
round($this->puntos/$this->totalPalabras,2) > ($this->tolerancia/10))
return 
true;
else
return 
false;
}
function 
valida_email($email){
   
$exp "^[a-z0-9]+([\._\-][a-z0-9]+)*@([a-z0-9]+([\._\-][a-z0-9]+))+$"
   if(
eregi($exp,$email)){ 
   if(
checkdnsrr(array_pop(explode("@",$email)),"MX")){ 
      return 
true
   }else{ 
     return 
false
   } 
   }else{ 
      return 
false
   } 
}
}
?>
La clase tiene varias funciones interesantes:

ControlUrl($dominio,$url);

Esta función es para cuando usas "recomeinde este sitio a un amigo", seguramente en el form tienes un campo oculto con la URL a recomendar.

Entonces lo que hace es tomar esa url y fijarse si en el comienzo de la URL esta tu dominio (esto es para que no recomienden sitio que no son tuyos, spam)

textCleaner($text);

Limpia de la cadena (nombre, mensaje, etc) etiquetas html y php

controlPalabras($text);

Esta función evalúa una cadena (palabra por palabra) y se fija si en esa cadena hay algunas de las palabnras consideradas spameras y además va contando el total de las palabras del formualrio

karma();

Esta funcion le asigna un karma. Toma la cantidad de palabras de spam encontradas y la divide por el total de palabras del form en los campos controlados. Si el karma es mayor a la tolerancia entonces devuelve true.

La tolerancia se configura al crear un objeto. Va del 1 en adelante, mientras mayor sea el número maytor será la tolerancia


valida_email($email);

Valida los emails del form


Veamos cómo se usa aplicándolo al famoso "recomeinde este sitio a un amigo".
Los campos del formulario que se han enviado son:
-friendname
-friendemail
-yourname
-youremail
-subject
-recurl (campo oculto)

Vamos al código (se supone que ya han enviado el formulario y lo vamos a procesar):

Código PHP:
// Incluimos la clase
include_once("antispam.class.php");
 
// instanciamos el objeto indicando la tolerancia del 1 en adelante
$noSpam = new antispam(3);
 
if (!
$noSpam->ControlUrl('http://www.midominio.com',$_POST['recurl']))
die(
'acceso incorrecto!');
 
// Limpiemos los textos
$url $noSpam->textCleaner($_POST['recurl']);
$nombre_amigo $noSpam->textCleaner($_POST['friendname']);
$su_nombre $noSpam->textCleaner($_POST['yourname']);
$su_email $noSpam->textCleaner($_POST['youremail']);
$titulo $noSpam->textCleaner($_POST['subject']);
 
// En busqueda de la puntuación
$noSpam->controlPalabras($url);
$noSpam->controlPalabras($nombre_amigo);
$noSpam->controlPalabras($su_nombre);
$noSpam->controlPalabras($titulo);
$noSpam->controlPalabras($su_email);
 
if (
$noSpam->karma())
die (
'Ups! se ha detectado intento de spam');
 
if (!
$noSpam->valida_email($_POST['youremail']))
{
die (
'Su email no es válido');
}
if (!
$noSpam->valida_email($_POST['friendemail']))
{
die(
'el email de tu amigo no es válido');

Obviamente yo he tratado a los erroresw con "die()" pero tu deberás adaptarlo a la manera de mostrar los errores en tus formularios.

Espero sus comentarios y/o aportes.
Saludos!!

Última edición por usermax; 13/04/2008 a las 17:48 Razón: Corrección de Código
  #2 (permalink)  
Antiguo 13/04/2008, 11:07
(Desactivado)
 
Fecha de Ingreso: diciembre-2006
Mensajes: 529
Antigüedad: 17 años, 4 meses
Puntos: 11
Re: Aporte: Sistema Anti-Spam

Ya corregi algunos detalles del código arriba...

Última edición por usermax; 13/04/2008 a las 17:12
  #3 (permalink)  
Antiguo 13/04/2008, 17:11
(Desactivado)
 
Fecha de Ingreso: diciembre-2006
Mensajes: 529
Antigüedad: 17 años, 4 meses
Puntos: 11
Re: Aporte: Sistema Anti-Spam

Hola,
Algún comentario?


Vamos!!
Saludos ;)
  #4 (permalink)  
Antiguo 13/04/2008, 17:28
Avatar de hgp147  
Fecha de Ingreso: diciembre-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 980
Antigüedad: 17 años, 3 meses
Puntos: 36
Re: Aporte: Sistema Anti-Spam

Hola usermax. Esta interesante lo del karma(). Muy buen aporte.
__________________
Spread Firefox | Download Day 2008
¡Únete en nuestra misión para alcanzar el Record Guinness al software más descargado en 24 horas! http://www.spreadfirefox.com/es-ES/worldrecord/
  #5 (permalink)  
Antiguo 13/04/2008, 17:50
(Desactivado)
 
Fecha de Ingreso: diciembre-2006
Mensajes: 529
Antigüedad: 17 años, 4 meses
Puntos: 11
De acuerdo Re: Aporte: Sistema Anti-Spam

Hola hgp147,

Muchas gracias!!
Muchas veces algun de las palabras consideredas como spam son usadas en mensajes legítimos.
Entonces es mejor trabajar con índices y posibilidades.

Saludos!
  #6 (permalink)  
Antiguo 13/04/2008, 20:38
Avatar de pato12  
Fecha de Ingreso: septiembre-2007
Ubicación: Salta
Mensajes: 1.620
Antigüedad: 16 años, 6 meses
Puntos: 101
Re: Aporte: Sistema Anti-Spam

Muy buen aporte, te felizito mucho.
Gracias
Salu2
__________________
Half Music - www.halfmusic.com
  #7 (permalink)  
Antiguo 13/04/2008, 22:00
(Desactivado)
 
Fecha de Ingreso: diciembre-2006
Mensajes: 529
Antigüedad: 17 años, 4 meses
Puntos: 11
Re: Aporte: Sistema Anti-Spam

Gracias pato12!!

Sería cuestión de completar la lista (dentro de la expresión regular) de la variable $listOut con las palabras que falten o que vayan usando los spammeros para tener nuestra lista lo más actualizada posible.
Mejor funcionará la clase.

SAludos y espero vuestros retornos, sugerencias o inquietudes ;)
  #8 (permalink)  
Antiguo 14/04/2008, 01:44
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Re: Aporte: Sistema Anti-Spam

siiiii karma() suena bien... ke bien la haces
  #9 (permalink)  
Antiguo 14/04/2008, 06:36
(Desactivado)
 
Fecha de Ingreso: diciembre-2006
Mensajes: 529
Antigüedad: 17 años, 4 meses
Puntos: 11
Re: Aporte: Sistema Anti-Spam

Gracias pateketrueke!!
Si alguno lo implementa, avise asi vemos cómo funciona.
  #10 (permalink)  
Antiguo 14/04/2008, 09:41
Avatar de Carlojas  
Fecha de Ingreso: junio-2007
Ubicación: Shikasta
Mensajes: 1.272
Antigüedad: 16 años, 10 meses
Puntos: 49
Re: Aporte: Sistema Anti-Spam

Buen aporte y solución usermax




Saludos.
  #11 (permalink)  
Antiguo 14/04/2008, 09:47
(Desactivado)
 
Fecha de Ingreso: diciembre-2006
Mensajes: 529
Antigüedad: 17 años, 4 meses
Puntos: 11
Re: Aporte: Sistema Anti-Spam

Gracias Carlojas!!

Si tienen ideas o sugerencia spara mejorar el script haganmelo saber asi lo implementamos.
Saludos

Última edición por usermax; 14/04/2008 a las 18:05
  #12 (permalink)  
Antiguo 13/05/2008, 13:02
Avatar de [NiRVaNa]  
Fecha de Ingreso: abril-2004
Ubicación: Someplace In The Middle Of Nowhere!
Mensajes: 325
Antigüedad: 20 años
Puntos: 6
Re: Aporte: Sistema Anti-Spam

Entonces si yo quisiera hacer un formulario de contacto para que envien un mensaje a xx mail mediante la funcion mail(), lo unico que tengo que hacer es la validacion correspondiente con la clase, y luego el envio del mail en si?
  #13 (permalink)  
Antiguo 15/05/2008, 21:04
(Desactivado)
 
Fecha de Ingreso: diciembre-2006
Mensajes: 529
Antigüedad: 17 años, 4 meses
Puntos: 11
Respuesta: Aporte: Sistema Anti-Spam

Exacto!!
Además puedes hacer otras validaciones propias de tu formulario.
Este detecta intento de spam.

Saludos
  #14 (permalink)  
Antiguo 04/10/2008, 23:20
 
Fecha de Ingreso: octubre-2008
Mensajes: 4
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Re: Aporte: Sistema Anti-Spam

Cita:
Iniciado por usermax Ver Mensaje
Gracias Carlojas!!

Si tienen ideas o sugerencia spara mejorar el script haganmelo saber asi lo implementamos.
Saludos
Perdón por revivir este thread, pero se me ocurre algo.

karma() podria devolver otros valores ademas de true o false, es decir, podria devolver por ejemplo 0, 1 y 2.

Si es 0 no es spammer, si es 1 es un posible spammer (notifica al administrador, pero deja postear/enviar) y si es 2 (notifica y denega el posteo/envio).

Se le podrian poner mas valores de karma, y asi enviar advertencias al usuario, al admin, etc... todo segun el karma obtenido.
  #15 (permalink)  
Antiguo 08/11/2008, 05:32
(Desactivado)
 
Fecha de Ingreso: diciembre-2006
Mensajes: 529
Antigüedad: 17 años, 4 meses
Puntos: 11
Respuesta: Aporte: Sistema Anti-Spam

Buena observación. Apenas pueda la implemento y aviso.

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 3 personas




La zona horaria es GMT -6. Ahora son las 21:55.