Inicio

Ofuscar direcciones de correo electrónico en PHP

Viernes, 19 de diciembre de 2014

0
+3000

¿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.

Publicidad

Ofuscar direcciones de correo electrónico con PHP

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.

Ofuscar direcciones de correo electrónico con PHP

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(
	"-" => "&#45;",  "." => "&#46;",  ":" => "&#58;",  "@" => "&#64;",
	"_" => "&#95;",  "a" => "&#97;",  "b" => "&#98;",  "c" => "&#99;",
	"d" => "&#100;", "e" => "&#101;", "f" => "&#102;", "g" => "&#103;",
	"h" => "&#104;", "i" => "&#105;", "j" => "&#106;", "k" => "&#107;",
	"l" => "&#108;", "m" => "&#109;", "n" => "&#110;", "o" => "&#111;",
	"p" => "&#112;", "q" => "&#113;", "r" => "&#114;", "s" => "&#115;",
	"t" => "&#116;", "u" => "&#117;", "v" => "&#118;", "w" => "&#119;",
	"x" => "&#120;", "y" => "&#121;", "z" => "&#122;"
);

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("&#58;", "%40", $mailto);
	$mailto = str_replace("@", "%40", $mailto);
	
	return "<a class=\"email\" href=\"ma&#105;lt&#111;&#58;" . $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éis lo siguiente:

Ofuscar direcciones de correo electrónico con PHP

Bueno, pues esto es todo. Os dejo a continuación un ejemplo totalmente funcional disponible para su descarga:

Como siempre, espero que os sea de gran utilidad.

Publicidad

Deja tu comentario

Puedes utilizar el siguiente formulario para aportar tu opinión o contestar a otros usuarios. Por favor, sé educado y respetuoso con los demás y no olvides revisar la ortografía. Si tu comentario es muy extenso, separa el texto en varios párrafos.

  • Introduce tu nombre. No temas, Michu no tiene un Death Note.
  • Debes introducir tu dirección de correo electrónico.

Acepto el aviso legal y la política de privacidad de este sitio web.