Wednesday 23 February 2011

Esconder direcciones de email a los spammers usando base64

De todos es conocido que no es muy recomendable dejar a la vista direcciones de correo electrónico porque los robots usados por los "spammers" los chupan inmediatamente. Voy a compartir aquí un método nuevo (y creo que sencillo de implementar) a todos los que ya hay, usando codificación en base64.

Supongamos que el HTML que nosotros queremos renderizar es:

<p>correo: mi@correo.com</p>

entonces, para este caso, pondremos:

<p>correo: <span class='e64'>bWlAY29ycmVvLmNvbQ==</span>


en dónde "bWlAY29ycmVvLmNvbQ==" es la codificación en base64 de la dirección "mi@correo.com". Por de pronto, en esta línea de HTML los robots ya no encuentran una arroba ni nada que se le parezca!

Para conseguir renderizar eso con PHP sería con algo como:

1  <?php
2  
3    
echo "<p>correo: <span class='e64'>"
4              
.base64_encode("mi@correo.com")
5              .
"</span></p>";
6  
7  
?>


Lo que nos toca hacer ahora es usar algo de javascript para que en cuanto se cargue la página el navegador sustituya el contenido de este spam por el valor decodificado. Para ello, necesitaremos echar mano de alguna función decodificadora de base64 para javascript. Lo que yo suelo hacer en estos casos es buscar en el proyecto PHP.js que es una librería abierta de funciones de PHP pasadas a javascript, genial, verdad!? En nuestro caso esta es la función que nos decodificará el base64:

http://phpjs.org/functions/base64_decode:357

Así que hazlo como quieras, pero añádele al javascript de tu página esta función. También necesitarás añadir esta otra función que es usada por la anterior:

http://phpjs.org/functions/utf8_decode:576

Por último, añade también el siguiente código que usa jQuery:

1  <script>
2  
3    $(document).ready(function(){
4      $("span[class^='e64']").attr('class', function(){
5        $(this).html(base64_decode($(this).html()));
6      });
7    });
8  
9  </script>

Usando jQuery la cosa se simplifica al máximo, pero en fin, puedes hacerlo sin necesidad de jQuery, usando otros frameworks u otro javscript "a pelo".

Lo que hace este jQuery es indicar que una vez cargada la página ("document ready") busque TODOS los span cuya clase comience con "e64" y les reemplaze el html que contienen por el mismo html decodificado.

Consideraciones finales

Ya puedes imaginar que las variaciones posibles son muchas: llámale como quieras a tu clase, no hace falta que sea un span, etc... eso ya depende de tu creatividad y tus necesidades. Pero creo que esta técnica puede dar mucho de sí. De hecho, la hallé hoy implementada en un website pero no para ocultar emails sino para otra cosa que ni siquiera entendí la razón, jejeje...

Se agradecerá que si le das un uso diferente lo compartas con un comentario ;) así podemos sacarle todos provecho.

En cuanto a la efectividad para ocultar emails... bueno, creo que es "suficiente" si tu web no tiene atractivo suficiente como para querer ser "atacada" de manera directa. Es decir, suponiendo que nuestras webs son periódicamente visitadas por robots buscando arrobas, con este método conseguiremos esquivarles. Pero, si tienes una web que quiere ser escaneada (no sé, por ejemplo que tuviéras un buen directorio de profesionales de la medicina con sus emails públicos), entonces rápidamente se te vería el plumero y cualquier hacker se saltaría tu codificación en base64 en menos de 3 minutos ;)

En este sentido, si tienes alguna idea para sofisticar más el código de tal manera que realmente los emails queden ocultos sí o sí... se agradecería un comentario. Claro, en la línea de hacerlo con javascript o algo parecido, es decir, usando tecnología de cliente, no de servidor... aunque no sé si eso será posible.

No comments:

Post a Comment