Ofuscando emails desde Java

Para evitar el spam, hay muchas maneras de ocultar el email en una página html. Una de las más efectiva podría ser crear una imagen con la dirección como tengo puesto en mi página de contacto: . Puedes crear esta imagen con el photoshop o desde alguna utilidad externa como esta.

Sin embargo, puede que estemos desarrollando una aplicación en Java y tengamos un listado de usuarios público con sus emails. Crear una imagen para cada uno de ellos podría ser muy laborioso, y escribir el email sin ofuscar u ocultar podría ser peligroso.

Obviando los trucos de poner los emails con el formato “nombre ARROBA dominio PUNTO es” o “email@[QUITAESTO]dominio.es” podemos escribir cada carácter ASCII de nuestro email uno por uno en hexadecimal o decimal. Para esto, utilizaremos las entidades html con este formato:

  • &#D; siendo D el número del código ASCII en decimal
  • &#xH; siendo H el número del código ASCII en hexadecimal

Por ejemplo, para pintar la letra a, cuyo código ASCII es 97 en decimal y 61 en hexadecimal podemos utilizar a o a
(Una tabla completa con todos los caracteres ASCII aqui)

Bueno, ahora lo que queremos es escribir nuestros emails codificados en decimal y hexadecimal. Para eso utilizaremos esta clase Java:

public class HtmlCoder {
   public static final Random r = new Random(System.currentTimeMillis());
   public static String randomHtmlEncode(String data) {
        if (data == null || data.length() == 0) return data;
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < data.length(); i++) {
            switch (r.nextInt(3)) {
            case 0 : // En decimal
                sb.append("&#").append((int)data.charAt(i)).append(";");
                break;
            case 1 : // En hexadecimal
                sb.append("&#x").append(Integer.toHexString(data.charAt(i))).append(";");
                break;
            case 2 : // Tal cual
                sb.append(data.charAt(i));
            }
        }
        return sb.toString();
    }
}

Esta clase crea un texto codificando cada carácter en su equivalente ascii en decimal, hexadecimal o sin codificar de manera aleatoria. De esta manera, un email se quedaría así: &#x73;&#x6f;&#x79;&#x70;ic&#x61;p&#105;&#99;a&#x40;&#x79;&#97;&#x68;o&#x6f;.&#x65;&#115;

4 thoughts on “Ofuscando emails desde Java

  1. Hola:

    Hay una cosa que creo que se me escapa. Entiendo que se ponga una imágen o lo del [ARROBA] y [QUITA ESTO] porque así el email queda legible para los humanos, pero no para los robots rastreadores.
    Con el codificador este no queda legible para nadie, así que supongo que no es para poner el email en una web. ¿Para qué sirve entonces?

    Se bueno.

  2. Hola:

    Ya está aclarado, ya decía yo que se me escaba algo. Se pone eso en el html y el navegador lo visualiza correctamente. Perdón.

    Se bueno.

  3. Nada hombre, si es que eso me pasa por poner trucos pero no decir para que sirven! De todas formas, cuanto más miro la “solución”, menos me convence.
    Si los email-harvesters solo buscan la @ para detectar emails, también pueden hacerlo buscando su código correspondiente en ascii &#64; o hexadecimal &#x40; …. no me convence el truco para nada…

Comments are closed.