VoidWyrm

Tu privacidad es importante para nosotros.

Este sitio web utiliza cookies propias y de terceros para analizar tu navegación con fines estadísticos, de personalización y publicitarios, incluido el mostrarte publicidad personalizada a partir de un perfil elaborado en base a tu navegación. Al hacer clic en "Aceptar cookies", estarás dando tu consentimiento para esta actividad. Puedes encontrar más información en el apartado Privacidad y cookies.

VoidWyrm

Ofuscar direcciones de correo electrónico en PHP

19 de diciembre de 2014

+2500

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

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ás lo siguiente:

<p><a class="email" href="ma&#105;lt&#111;&#58;&#105;n&#102;o&#64;d&#111;m&#105;n&#105;o&#46;c&#111;m">moc.oinimod@ofni</a></p>
<p><a class="email" href="ma&#105;lt&#111;&#58;&#99;o&#110;t&#97;c&#116;o&#64;e&#120;a&#109;p&#108;e&#46;c&#111;m">moc.elpmaxe@otcatnoc</a></p>
<p><a class="email" href="ma&#105;lt&#111;&#58;&#100;i&#114;e&#99;c&#105;o&#110;%40&#103;m&#97;i&#108;.&#99;o&#109;">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.

  • Introduce tu nombre. No temas, no tengo un Death Note.
  • Introduce tu correo electrónico. No se compartirá con nadie.

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