Ofuscar direcciones de correo electrónico en PHP
19 de diciembre de 2014
¿Tienes un sitio web y estás cansado de recibir spam? Ofusca las direcciones de correo electrónico que se muestran en él y ya verás como el correo no deseado disminuye con el paso del tiempo.
Uno de los diversos problemas con el que nos solemos encontrar los programadores web cuando desarrollamos un sitio es el derivado de publicar en él nuestras direcciones de correo electrónico, es decir, en un momento u otro vamos a comenzar a recibir en estas direcciones mensajes correo electrónico no deseados, fraudulentos, malintencionados,... en definitiva, spam.
Para prevenir o, al menor, disminuir el número de mensajes de spam que recibimos en nuestro correo existen diferentes métodos, cada uno con sus ventajas y sus inconvenientes.
Uno de los primeros que se utilizó fue el de publicar las direcciones de correo electrónico como imágenes, ya que así no son detectadas por los robots que exploran las webs para extraer de ellas sus direcciones de email.
Otra técnica muy frecuente que se ha empleado bastante consiste en escribir las direcciones de correo utilizando nuestro lenguaje natural para ello, por ejemplo:
direccion [ARROBA] dominio [PUNTO] com
Actualmente existen otros métodos mejores que los anteriores, como escribir las direcciones como si fueran palíndromos, es decir, de derecha a izquierda, para posteriormente invertirlas mediante CSS o JavaScript.
Por ejemplo, la dirección:
moc.oinimod@noiccerid
Será convertida en el navegador del usuario en:
direccion@dominio.com
Asimismo, existe otro procedimiento para ofuscar las direcciones de correo que consiste en reemplazar los caracteres que componen la dirección de correo por entidades HTML. De esta manera, al mostar el código fuente de la dirección de correo electrónico nos encontraremos con una amalgama de caracteres parecida a esto:
direccion@dominio.com
Mi método para ofuscar direcciones de correo electrónico.
El método que yo utilizo para ofuscar las direcciones de correo electrónico está basado en las dos técnicas anteriores. Básicamente invierte las direcciones de email y convierte algunos caracteres en entidades HTML. Además, añade etiquetas invisibles <span> a la dirección de email. Vayamos al código.
En primer lugar, defino un array asociativo que contiene todas las entidades HTML que se pueden utilizar:
$entidades = array(
"-" => "-", "." => ".", ":" => ":", "@" => "@",
"_" => "_", "a" => "a", "b" => "b", "c" => "c",
"d" => "d", "e" => "e", "f" => "f", "g" => "g",
"h" => "h", "i" => "i", "j" => "j", "k" => "k",
"l" => "l", "m" => "m", "n" => "n", "o" => "o",
"p" => "p", "q" => "q", "r" => "r", "s" => "s",
"t" => "t", "u" => "u", "v" => "v", "w" => "w",
"x" => "x", "y" => "y", "z" => "z"
);
A continuación, implemento una función que comprueba si un caracter puede ser reemplazado por alguna de las entidades HTML anteriores:
function es_entidad($c) {
global $entidades;
foreach ($entidades as $i => $v) {
if ($c == $i) return true;
}
return false;
}
Y para finalizar desarrollo la función que ofusca las direcciones de correo electrónico:
function ofuscar_email($email, $rev = false) {
$email_ofuscado = "";
if (!email_valido($email)) $email_ofuscado = $email;
else {
$email = strtolower($email);
$email_ofuscado = "";
global $entidades;
$p_tags = array(2,3,5,7,11,13,17);
for ($i = 0; $i < strlen($email); $i++) {
if ($i % 2 == 0 && es_entidad($email[$i])) $email_ofuscado .= $entidades[$email[$i]];
else $email_ofuscado .= $email[$i];
if (in_array($i, $p_tags)) $email_ofuscado .= "<span></span>";
}
}
if ($rev) return $email_ofuscado;
else $email_ofuscado_rev = ofuscar_email(strrev($email), true);
$mailto = $email_ofuscado;
$mailto = str_replace("<span></span>", "", $mailto);
$mailto = str_replace(":", "%40", $mailto);
$mailto = str_replace("@", "%40", $mailto);
return "<a class=\"email\" href=\"mailto:" . $mailto . "\">" . $email_ofuscado_rev . "</a>";
}
Como se puede observar, se utiliza otra función, email_valido(), para verificar si las direcciones de email son válidas. En caso negativo, se devuelve la dirección original sin ofuscar.
En lo relativo a los estilos CSS, es necesario incluir las siguientes reglas, para invertir las direcciones de correo y no mostrar las etiquetas <span> que contengan:
a.email {
direction: rtl;
unicode-bidi: bidi-override;
}
a.email span { display: none; }
Con esto ya disponemos de todos los elementos necesarios para aplicar esta técnica de ofuscación de direcciones de correo electrónico en nuestro sitio web. Para ello, llamamos a nuestra función mediante scripts PHP:
echo "<p>" . ofuscar_email("info@dominio.com") . "</p>";
echo "<p>" . ofuscar_email("contacto@example.com") . "</p>";
echo "<p>" . ofuscar_email("direccion@gmail.com") . "</p>";
Y al mostrar el código fuente del sitio en el navegador web encontrarás lo siguiente:
<p><a class="email" href="mailto:info@dominio.com">moc.oinimod@ofni</a></p>
<p><a class="email" href="mailto:contacto@example.com">moc.elpmaxe@otcatnoc</a></p>
<p><a class="email" href="mailto:direccion%40gmail.com">moc.liamg@noiccerid</a></p>
Bueno, pues esto es todo. Te dejo a continuación un ejemplo totalmente funcional disponible para su descarga:
Como siempre, espero que te sea de gran utilidad.
Si te ha gustado esta entrada y quieres apoyarme, puedes invitarme a un café:
Deja tu comentario
Puedes utilizar el siguiente formulario para aportar tu opinión o contestar a otras personas. Por favor, escribe con educación y respeto hacia los demás y no olvides revisar la ortografía. Si tu comentario es muy extenso, puedes separar el texto en varios párrafos.