Retroceder   Foros del Web > Programación para sitios web > PHP

Respuesta
 
Herramientas Desplegado
Antiguo 13-abr-2008, 09:51   #1 (permalink)
usermax tiene algunos puntos positivos de karma
 
Fecha de Ingreso: diciembre-2006
Mensajes: 515
Enviar un mensaje por MSN a usermax
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!!
__________________
www.dominiomax.com

Basta de spam en nuestros forms!! conoce AntiSpam Class

Última edición por usermax; 13-abr-2008 a las 17:48. Razón: Corrección de Código
usermax está desconectado   Responder Citando
Antiguo 13-abr-2008, 11:07   #2 (permalink)
usermax tiene algunos puntos positivos de karma
 
Fecha de Ingreso: diciembre-2006
Mensajes: 515
Enviar un mensaje por MSN a usermax
Re: Aporte: Sistema Anti-Spam

Ya corregi algunos detalles del código arriba...
__________________
www.dominiomax.com

Basta de spam en nuestros forms!! conoce AntiSpam Class

Última edición por usermax; 13-abr-2008 a las 17:12.
usermax está desconectado   Responder Citando
Antiguo 13-abr-2008, 17:11   #3 (permalink)
usermax tiene algunos puntos positivos de karma
 
Fecha de Ingreso: diciembre-2006
Mensajes: 515
Enviar un mensaje por MSN a usermax
Re: Aporte: Sistema Anti-Spam

Hola,
Algún comentario?


Vamos!!
Saludos ;)
__________________
www.dominiomax.com

Basta de spam en nuestros forms!! conoce AntiSpam Class
usermax está desconectado   Responder Citando
Antiguo 13-abr-2008, 17:28   #4 (permalink)
hgp147 tiene algunos puntos positivos de karma
 
Avatar de hgp147
 
Fecha de Ingreso: diciembre-2006
Ubicación: Argentina
Mensajes: 675
Enviar un mensaje por MSN a hgp147
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/
hgp147 está desconectado   Responder Citando
Antiguo 13-abr-2008, 17:50   #5 (permalink)
usermax tiene algunos puntos positivos de karma
 
Fecha de Ingreso: diciembre-2006
Mensajes: 515
Enviar un mensaje por MSN a usermax
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!
__________________
www.dominiomax.com

Basta de spam en nuestros forms!! conoce AntiSpam Class
usermax está desconectado   Responder Citando
Antiguo 13-abr-2008, 20:38   #6 (permalink)
pato12 está en el buen camino
 
Avatar de pato12
 
Fecha de Ingreso: septiembre-2007
Mensajes: 473
Re: Aporte: Sistema Anti-Spam

Muy buen aporte, te felizito mucho.
Gracias
Salu2
__________________
Videos Yao - Comparte tus videos con el mundo...
pato12 está desconectado   Responder Citando
Antiguo 13-abr-2008, 22:00   #7 (permalink)
usermax tiene algunos puntos positivos de karma
 
Fecha de Ingreso: diciembre-2006
Mensajes: 515
Enviar un mensaje por MSN a usermax
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 ;)
__________________
www.dominiomax.com

Basta de spam en nuestros forms!! conoce AntiSpam Class
usermax está desconectado   Responder Citando
Antiguo 14-abr-2008, 01:44   #8 (permalink)
pateketrueke tiene algunos puntos positivos de karma
 
Avatar de pateketrueke
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 1.862
Enviar un mensaje por MSN a pateketrueke
Re: Aporte: Sistema Anti-Spam

siiiii karma() suena bien... ke bien la haces
pateketrueke está desconectado   Responder Citando
Antiguo 14-abr-2008, 06:36   #9 (permalink)
usermax tiene algunos puntos positivos de karma
 
Fecha de Ingreso: diciembre-2006
Mensajes: 515
Enviar un mensaje por MSN a usermax
Re: Aporte: Sistema Anti-Spam

Gracias pateketrueke!!
Si alguno lo implementa, avise asi vemos cómo funciona.
__________________
www.dominiomax.com

Basta de spam en nuestros forms!! conoce AntiSpam Class
usermax está desconectado   Responder Citando
Antiguo 14-abr-2008, 09:41   #10 (permalink)
Carlojas está en el buen camino
 
Avatar de Carlojas
 
Fecha de Ingreso: junio-2007
Ubicación: Bucaramanga, Colombia
Mensajes: 638
Re: Aporte: Sistema Anti-Spam

Buen aporte y solución usermax




Saludos.
Carlojas está desconectado   Responder Citando
Antiguo 14-abr-2008, 09:47   #11 (permalink)
usermax tiene algunos puntos positivos de karma
 
Fecha de Ingreso: diciembre-2006
Mensajes: 515
Enviar un mensaje por MSN a usermax
Re: Aporte: Sistema Anti-Spam

Gracias Carlojas!!

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

Basta de spam en nuestros forms!! conoce AntiSpam Class

Última edición por usermax; 14-abr-2008 a las 18:05.
usermax está desconectado   Responder Citando
Antiguo 13-may-2008, 13:02   #12 (permalink)
[NiRVaNa] está en el buen camino
 
Avatar de [NiRVaNa]
 
Fecha de Ingreso: abril-2004
Ubicación: Someplace In The Middle Of Nowhere!
Mensajes: 156
Enviar un mensaje por MSN a [NiRVaNa]
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?
[NiRVaNa] está desconectado   Responder Citando
Antiguo 15-may-2008, 21:04   #13 (permalink)
usermax tiene algunos puntos positivos de karma
 
Fecha de Ingreso: diciembre-2006
Mensajes: 515
Enviar un mensaje por MSN a usermax
Respuesta: Aporte: Sistema Anti-Spam

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

Saludos
__________________
www.dominiomax.com

Basta de spam en nuestros forms!! conoce AntiSpam Class
usermax está desconectado   Responder Citando
Respuesta
Calificación: Calificación de Tema: 1 votos, 5,00 de promedio.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 05:17.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93