Formulario Anti-SPAM con Javascript y Mootools

Últimamente está muy de moda utilizar los formularios de contactos o formularios de envío de comentarios a blogs para hacer SPAM dejando direcciones de sitios en busca de publicidad gratuita. Por otro lado tenemos a los usuarios que usan los formularios para desahogarse y desatar su ira con palabras obscenas que luego los webmasters tienen que sufrir.
Para solucionar esto les propongo un script sencillo que nos puede ayudar a prevenir algunos de estos dolores de cabeza. En este post no estoy ofreciendo un componente, solo un pedazo de código javascript que podemos integrar en nuestra web con conocimientos básicos de programación javascript.
Aunque los chequeos que hace el script son bastante triviales me he auxiliado de la poderosa biblioteca de Mootools para añadir unos toques de efectos visuales y para valerme de su facilidad para gestionar los eventos.
Para utilizar este código necesitarían descargarse Mootools e incluirlo en la página.

<script type=”text/javascript” src=”js/mootools-release-1.11.js”></script>

En el HTML debe haber una capa donde notificaremos en caso de detección de SPAM.

//message es el id de algun textarea dentro de nuestro formulario
//<textarea cols="50"></textarea>
var txt = $('message');

//log_div es el id de una capa donde mostraremos los posibles errores
//<div></div>
var log = $('log_div');

//Añadimos un efecto al div donde mostraremos los errores
var fx = new Fx.Styles(log, {
	duration: 3500,
	wait: false,
	transition: Fx.Transitions.Quad.easeOut
});

//Añadiendo eventos al textarea
txt.addEvents({
    //On Focus
	//Si queremos cambiar el color de background cuando se seleccione
	//O si queremos eliminar el texto por defecto
	'focus': function() {
		if (txt.value.contains('escribe tu mensaje...')) txt.value = '';
		//Cambiando color de background
		txt.setStyle('background','none #6F6F6F');
	},

	//On Keyup
	//Chequeamos que no halla codigo malicioso ni palabra obscenas
	'keyup': function() {
		//Convertimos todo a minúsculas
		var text = txt.value;
		text = text.toLowerCase();

		//Chequeando que no se escriban direcciones en el mensaje
		var regexp = /(ftp|http|https)://(w+:{0,1}w*@)?(S+)(:[0-9]+)?(/|/([w#!:.?+=&%@!-/]))?/
		var x = regexp.test(text);

		//Por lo menos que no aparezca nada que comience con www
		var regexp2 = /(www)/
		var y = regexp2.test(text);

		//Si algunos de los chequeos anteriores dió positivo notificamos en el evento de que hay SPAM
		if (x==true || y==true){
		    //Ejecutamos el evento de notificacion de SPAM
			txt.fireEvent('burn', 'No se permiten direcciones web!');
			txt.value = txt.value.replace("www","");
			txt.value = txt.value.replace("http://","");
		}

		//Chequeamos que no se utilicen tags de html
		if(txt.value.contains("")){
			txt.value = txt.value.replace(">","");
		    //Ejecutamos el evento de notificacion de SPAM
			txt.fireEvent('burn','Eliminando caracteres potencialmente peligrosos');
		}

		//Diccionario de palabras no deseadas
		words = new Array("viagra","fuck","cialis","porno");

		//Chequeamos que no aparezcan ninguna de las palabras anteriores
		for(var i=0; i &lgt; words.length; i++){
			if(txt.value.contains(words[i])){
				txt.fireEvent('burn','SPAM reconocido');
				txt.value = txt.value.replace(words[i],'');
			}
		}
	},
	//On Burn
	//Este es un tipo de evento creado por nosotros que ejecutaremos siempre que se encuentra un SPAM
	'burn': function(text) {
	    //Insertamos el texto el el div donde se muestran los errores
		log.setHTML(text);

		//Ejecutamos el efecto para que haga una transición de opacidad
		fx.start({
			//'background-color': ['#990000', '#fff'],
			'color': ['#ff9c66', '#101b21'],

			'opacity': [1, 0]
		});
	}
});

Para ver un ejemplo funcionando pueden ir a la página de mi empresa equipo24 e ir a la sección de Contacto y probar algunas palabras como “viagra” o “porno”.
Espero que les sea útil.

Deja tu comentario

XHTML: Puedes usar las etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>