Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   PHP (http://www.forosdelweb.com/f18/)
-   -   Aporte: Sistema Anti-Spam (http://www.forosdelweb.com/f18/aporte-sistema-anti-spam-575520/)

usermax 13/04/2008 09:51

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!!

usermax 13/04/2008 11:07

Re: Aporte: Sistema Anti-Spam
 
Ya corregi algunos detalles del código arriba...

usermax 13/04/2008 17:11

Re: Aporte: Sistema Anti-Spam
 
Hola,
Algún comentario?


Vamos!!
Saludos ;)

hgp147 13/04/2008 17:28

Re: Aporte: Sistema Anti-Spam
 
Hola usermax. Esta interesante lo del karma(). Muy buen aporte.

usermax 13/04/2008 17:50

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!

pato12 13/04/2008 20:38

Re: Aporte: Sistema Anti-Spam
 
Muy buen aporte, te felizito mucho.
Gracias
Salu2 :adios:

usermax 13/04/2008 22:00

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 ;):aplauso:

pateketrueke 14/04/2008 01:44

Re: Aporte: Sistema Anti-Spam
 
siiiii karma() suena bien... ke bien la haces

usermax 14/04/2008 06:36

Re: Aporte: Sistema Anti-Spam
 
Gracias pateketrueke!!
Si alguno lo implementa, avise asi vemos cómo funciona.:si:

Carlojas 14/04/2008 09:41

Re: Aporte: Sistema Anti-Spam
 
Buen aporte y solución usermax:arriba:




Saludos.

usermax 14/04/2008 09:47

Re: Aporte: Sistema Anti-Spam
 
Gracias Carlojas!!

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

[NiRVaNa] 13/05/2008 13:02

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?

usermax 15/05/2008 21:04

Respuesta: Aporte: Sistema Anti-Spam
 
Exacto!!
Además puedes hacer otras validaciones propias de tu formulario.
Este detecta intento de spam.

Saludos

SERBice 04/10/2008 23:20

Respuesta: Re: Aporte: Sistema Anti-Spam
 
Cita:

Iniciado por usermax (Mensaje 2363067)
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.

usermax 08/11/2008 05:32

Respuesta: Aporte: Sistema Anti-Spam
 
Buena observación. Apenas pueda la implemento y aviso.

Saludos


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

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.