在网站上混淆电子邮件地址的最佳方法是什么?

过去几天我一直在更新我的个人网站。我个人网站的 URL 是(我的名字)。(我的姓)。Com,因为我的姓很不寻常,我很幸运地得到了这个域名。我的电子邮件地址是(我的名)@(我的姓)。Com.所以说,归根结底,猜测并不难。

无论如何,我想整合一个 mailto: 链接到我的网站,这样人们可以与我联系。而且,尽管我的电子邮件地址不是很难猜,我还是不希望它被垃圾邮件机器人收获,这些机器人只是抓取网站的电子邮件地址模式,并将其添加到他们的数据库中。

什么是我混淆我的电子邮件地址的最佳方法,最好是链接形式?我知道的方法有:

<a href="mailto:x@y.com">e-mail me</a>

这很有效,但也意味着只要我的网站点击了 Google,我就会像垃圾邮件机器人一样轻松地找到我的电子邮件地址。

<img src="images/e-mail.png" />

这是不太可取的,因为访问者不仅无法点击它向我发送电子邮件,而且更聪明的垃圾邮件机器人可能能够检测到图像中包含的字符。

我知道可能没有完美的解决方案,但我只是想知道大家认为什么是最好的。如果有必要的话,我当然愿意使用 JavaScript,因为我的网站已经使用了大量的 JavaScript。

106874 次浏览

不要在这里使用任何模糊处理技术,因为这可能是电子邮件收集器首先要找出人们如何模糊处理电子邮件的地方。如果你必须让你的电子邮件地址显示在网站上,不要只是一字不差地复制别人的方法; 用一些其他网站没有使用过的独特方式混淆它,这样你的方法就不会在收获者访问你的网站之前被他们知道。

我使用了 JavaScript 模糊处理,看看这个例子:

Http://www.jottings.com/obfuscator/

当前可接受的解决方案是创建一个联系表单,允许用户给您发送电子邮件。如果你收到很多垃圾邮件(我不在我的网站上) ,那么你可以添加一个验证码,以便更好地衡量,你将远离“低挂水果”在这一点上。

事实上,如果你提供了一个链接,用户可以点击打开他们的电子邮件客户端与您的地址在收件人: 字段,然后计算机能够破译的电子邮件地址从网页,因此可以垃圾邮件机器人。

我将字符编码为 HTML 实体(就像这样)。它不需要启用 JS,似乎已经阻止了大多数垃圾邮件。我想一个聪明的机器人也许还能收获它,但我还没遇到任何问题。

就我个人而言,我已经放弃了隐藏我的电子邮件地址。我发现寻找更好的垃圾邮件过滤解决方案比担心混淆更容易。你可以花几天时间试图找到最好的方法来混淆你的地址,然后只需要一个人把你的地址卖给垃圾邮件制造者,所有的工作都是无用的。

老实说,如果您询问 mailto 是否真的是您想要使用的,那么您的问题可能就没有实际意义了。例如,许多使用 Web 邮件的人,或者浏览器中没有正确的邮件客户端设置的人,都不会从 mailto 中受益。你将你的电子邮件地址暴露给了一个功能,而这个功能对于你的大部分用户来说并不起作用。

相反,您可以使用表单在幕后发送电子邮件,这样就可以隐藏电子邮件地址,而不必担心那些无法从 mailto 中获益的可怜人。

你可以像谷歌一样在谷歌代码(和组)上做。显示电子邮件的一部分,以及可点击的部分(“ ...”)。单击表示您想知道该电子邮件,并要求您填写验证码。然后是电子邮件(还有其他的?)对你来说是可见的。

显然,使用 CSS 改变文本的方向工作得很好。这个链接也测试了一些其他的模糊处理方法。

不管你用什么,都必然会失败。你的主要目标应该是避免惹恼你的用户。

我不知道这样有多好。你能不能不留下你的电子邮件地址,使它加载使用 AJAX 调用一旦页面已经完成加载。不确定垃圾邮件机器人是否能够检测到修改后的 HTML,或者它们是否足够聪明,能够监听其他 HTTP 流量来尝试选择电子邮件地址,或者它们是否只是在第一次接收到页面时扫描该页面。

我维护的一个网站使用了一种有点过于简单的 JavaScript 方法(希望如此)来阻止垃圾邮件程序。

电子邮件链接调用一个 JS 函数:

function sendEmail(name, domain) {
location.href = 'mailto:' + name + '@' + domain;
}

为了确保只有启用了 JS 的用户才能看到这个链接,用以下方法将它们写出来:

function writeEmailLink(realName, name, domain) {
document.write('<a href="javascript:sendEmail(\''
+ name + '\', \'' + domain + '\')">');
document.write(realName);
document.write('</a>');
}

使用一个 JS 函数写出一个调用另一个的链接意味着有两层保护。

你说这是你的个人网站。在我的个人网站上(比如 bobsomers.com) ,我只有一段话说:

联系我的最好方式 在新网站建立之前是发送 我的电子邮件地址是我的 你可在此网页找到你的名字 不能从那个暗示中理解出来, 你可能会发现电子邮件更像是 更有挑战性 地址。

人们似乎能够很好地解决这个问题,因为我总是收到合法的电子邮件。有时最好的解决方案不需要编写任何代码。:)

如果使用 PHP,则可以获取自动执行此操作的免费脚本。它被称为“私人爸爸”,我们使用它为我们自己的在线音频流服务。只要一行代码,它的工作方块... 你可以抓住它 给你

如果你在你的网站上说: “我的电子邮件地址是(我的名)@(我的姓)。”,你的名字和姓氏是非常明显的,这似乎是最好的垃圾邮件保护,你会得到。

一个家伙测试了9种不同的方式在页面上显示电子邮件地址,然后在他的博客上显示 公布的结果

他最好的三个方法是:

  1. 用 CSS 改变代码方向
  2. 使用 CSS 显示: 无
  3. ROT13加密

注意,这是两年前发布的,垃圾邮件程序可能变得更聪明了。

我使用 PHP 函数生成一些 javascript 来在页面加载时输出电子邮件。注意,在运行时不需要 需要 PHP 来生成 JS,可以在本地生成一次 JS,然后在页面中包含静态 JS。

你也可以使用下面的链接函数来自动混淆给定 HTML 中的电子邮件地址(其中 $processedContent 是 HTML) :

 $emailMatches = array();
$matchCount = preg_match_all('/(?:[a-zA-Z0-9_\.\-])+\@(?:(?:[a-zA-Z0-9\-])+\.)+(?:[a-zA-Z0-9]{2,4})+/', $processedContent, $emailMatches);


if($matchCount > 0) {
$emailMatches = $emailMatches[0];


foreach($emailMatches as $email) {
$replacement = createJSMailLink($email);


$processedContent = str_replace($email, createJSMailLink($email), $processedContent);
}

如上所述,我还使用了来自 笔记网站的 JavaScript 模糊处理。

该网页生成了一些可以改进的 JavaScript。mailto:文本字符串是清晰的,可以被机器人识别(它可以发现这一点,并解决这个字符串) ,但是如果一个人进入 jottings.com 网页的电子邮件地址的形式是 mailto:addr@site.tld而不是 addr@site.tld,然后删除文本 mailto:从 JavaScript 生成,一个人突然有一些 JavaScript,看起来好像它与电子邮件没有任何关系-只是随机的 JavaScript,网络是满的。我们可以通过删除链接文本来进一步改进这一点——我用一个相当模糊的字体的电子邮件地址图片替换了我的链接文本。然后,为了防止 jottings.com 上的这种方法流行起来,我对输出 JavaScript 中的变量名进行了随机化,这样机器人就很难找到由 jottings.com 生成的 JavaScript 代码的一个实例。

显然,这些改进中的一些可以内置到草稿本身的机制中,而且由于代码是公开的,这将是相对容易的。

举个例子可能会更清楚一些。我在上面的链接中使用了 Jottings Obfuscator 来模糊 mailto:foo@bar.com(注意,我违背了草稿网站的初衷,输入字符串 mailto:foo@bar.com而不是 foo@bar.com) ,文本为“发送我电子邮件”,草稿变成了这个 Javascript:

<script type="text/javascript" language="javascript">
<!--
// Email obfuscator script 2.1 by Tim Williams, University of Arizona
// Random encryption key feature by Andrew Moulden, Site Engineering Ltd
// This code is freeware provided these four comment lines remain intact
// A wizard to generate this code is at http://www.jottings.com/obfuscator/
{ coded = "3A1OTJ:rJJ@VAK.GJ3"
key = "J0K94NR2SXLupIGqVwt8EZlhznemfaPjs7QvTB6iOyWYo3rAk5FHMdxCg1cDbU"
shift=coded.length
link=""
for (i=0; i<coded.length; i++) {
if (key.indexOf(coded.charAt(i))==-1) {
ltr = coded.charAt(i)
link += (ltr)
}
else {
ltr = (key.indexOf(coded.charAt(i))-shift+key.length) % key.length
link += (key.charAt(ltr))
}
}
document.write("<a href='mailto:"+link+"'>Send Me Email</a>")
}
//-->
</script><noscript>Sorry, you need Javascript on to email me.</noscript>

拿回来之后,我把它粘贴到一个编辑器里,然后:

  1. 移除 mailto:
  2. 将链接文本替换为指向我的电子邮件地址图像的指针
  3. 重命名所有变量
  4. 将“ noscript”部分替换为指向电子邮件地址图像的另一个链接

我的结局是这样的:

<script type="text/javascript" language="javascript">
<!--
// Email obfuscator script 2.1 by Tim Williams, University of Arizona
// Random encryption kkeoy feature by Andrew Moulden, Site Engineering Ltd
// This kudzu is freeware provided these four comment lines remain intact
// A wizard to generate this kudzu is at http://www.jottings.com/obfuscator/
{ kudzu = "3A1OTJ:rJJ@VAK.GJ3"
kkeoy = "J0K94NR2SXLupIGqVwt8EZlhznemfaPjs7QvTB6iOyWYo3rAk5FHMdxCg1cDbU"
shift=kudzu.length
klonk=""
for (variter=0; variter<kudzu.length; variter++) {
if (kkeoy.indexOf(kudzu.charAt(variter))==-1) {
lutu = kudzu.charAt(variter)
klonk += (lutu)
}
else {
lutu = (kkeoy.indexOf(kudzu.charAt(variter))-shift+kkeoy.length) % kkeoy.length
klonk += (kkeoy.charAt(lutu))
}
}
document.write("<a href='"+klonk+"'><img src='contactaddressimage.png' alt='Send Me Email' border='0' height='62' width='240'></a>")
}
//-->
</script>
<noscript>
<img src="contactaddressimage.png" border="0" height="62" width="240">
<font face="Arial" size="3"><br>&nbsp;</font></p>
</noscript>

我的其实很简单:

<h3 id="email">hello@gmail.com</h3><!-- add a fake email -->




$(document).ready(function(){
//my email in reverse :)
var s = 'moc.elibomajninbew@htiek';
var e = s.split("").reverse().join("");
$('#email').html('<a href="mailto:'+e+'">'+e+'</a>');
});

如果有人在使用 Rails,他们可以使用 actionview-encoded_mail_to gem

有几种选择:

: encode-此键将接受字符串“ javascript”或“ hex”。 传递“ javascript”将动态创建和编码 mailto 然后将它赋值到页面的 DOM 中。这个方法不会显示 如果用户禁用了 JavaScript,则显示页面上的链接 “十六进制”将在输出 mailto 之前对 email _ address 进行十六进制编码 链接。

: place _ at-如果未提供链接名称,则 Email _ address 用于链接标签。您可以使用此选项来 通过用字符串替换@符号来混淆 email _ address 作为价值给出。

: place _ dot-当没有提供链接名称时, Email _ address 用于链接标签。您可以使用此选项 通过将电子邮件中的. 替换为. 来混淆 email _ address 作为值给出的字符串。

<!-- Multi-Email Obfuscator  -->
<!-- step 1: &#064; = @  -->
<!-- step 2: a scrap element  -->
<!-- step 3: ROT13 encode for .com  -->
info<!-- step 1 -->&#064;<!-- step 2 --><b style="display:none">my</b>domain<!-- step 3 --><script>document.write(".pbz".replace(/[a-zA-Z]/g,function(c){return String.fromCharCode((c<="Z"?90:122)>=(c=c.charCodeAt(0)+13)?c:c-26);}));</script>

另一种方法是使用 JavaScript 框架并将数据/模型绑定到 HTML 元素。对于 AngularJS,HTML 元素将被写成:

<a href="mailto:\{\{contactEmail}}"><span>\{\{contactEmail}}</span></a>

插值\{\{ data }}绑定使用包含实际电子邮件值的范围变量。此外,亦可使用过滤器处理电邮的解码工作,方法如下:

<a href="mailto:\{\{contactEmail | decode}}"><span>\{\{contactEmail | decode}}</span></a>

好处在于 HTML 的编写方式。缺点是它需要脚本支持,有些人可能不支持。

只是另一种方法。

混淆锚的 href的一种轻量级方法是 base64编码:

> btoa('mailto:email@example.com')
< "bWFpbHRvOmVtYWlsQGV4YW1wbGUuY29t"

然后加上硬编码:

<a href="javascript:window.location.href=atob('bWFpbHRvOmVtYWlsQGV4YW1wbGUuY29t')">E-Mail</a>

或者动态的服务器端,例如 PHP:

<a href="javascript:window.location.href=atob('<?= base64_encode("mailto:email@example.com") ?>')">E-Mail</a>

结合字符串恢复,它可以相当垃圾邮件保存:

<a href="javascript:window.location.href=atob('<?= base64_encode("mailto:email@example.com") ?>')" style="unicode-bidi: bidi-override; direction: rtl;"><?= strrev("email@example.com") ?></a>

使用 JQuery,但是如果需要,可以很容易地移植到纯 JS。将采用以下 HTML 块。我提供的这个例子也适用于电话通话的 tel:链接。

<a class="obfuscate"
href="mailto:archie...trajano...net">
archie...trajano...net
</a>
<a class="obfuscate"
href="tel:+One FourOneSix-EightFiveSix-SixSixFiveFive">
FourOneSix-EightFiveSix-SixSixFiveFive
</a>

并使用 Javascript 将其转换为正确的链接。

$(".obfuscate").each(function () {


$(this).html($(this).html()
.replace("...", "@").replace(/\.\.\./g, ".")
.replace(/One/g, "1")
.replace(/Two/g, "2")
.replace(/Three/g, "3")
.replace(/Four/g, "4")
.replace(/Five/g, "5")
.replace(/Six/g, "6")
.replace(/Seven/g, "7")
.replace(/Eight/g, "8")
.replace(/Nine/g, "9")
.replace(/Zero/g, "0"))


$(this).attr("href", $(this).attr("href")
.replace("...", "@").replace(/\.\.\./g, ".")
.replace(/One/g, "1")
.replace(/Two/g, "2")
.replace(/Three/g, "3")
.replace(/Four/g, "4")
.replace(/Five/g, "5")
.replace(/Six/g, "6")
.replace(/Seven/g, "7")
.replace(/Eight/g, "8")
.replace(/Nine/g, "9")
.replace(/Zero/g, "0"))


})

我在这里更详细地记录了它 https://trajano.net/2017/01/obfuscating-mailto-links/

反/模糊处理算法非常简单,因此编写它也不会太费力(不需要 base64解析)

Ajax 调用解决方案

最好是在网站上有一个表单,而不是显示电子邮件地址,因为所有的机器人日复一日地变得更加智能,但是如果你需要在网站上显示电子邮件地址,那么,你可以在你的服务器上使用 ajax 呼叫,然后点击显示它。

超文本标示语言

<a class="obfmail" href="#" rel="info">click here to show email address</a>

或者

<a class="obfmail" href="#" rel="info">
<img src="img/click-to-show-email.jpg">
</a>

JQuery

$(document).one'click', '.obfmail', function(e) {
e.preventDefault();
a = $(this);
addr = a.attr('rel');
$.ajax({
data: {
email: addr
},
url : "/a/getemail",
type: "POST",
dataType: 'json',
success: function(data) {
a.html(data.addr);
a.attr('href', 'mailto:' + data.addr);
}
});
});

PHP

if($_POST['email']) {
...
return json_encode(array(
code     => '200',
response => 'success',
addr     => 'info@domain.ltd'
));
}

为了更加安全,您可以像这样将 .on改为 .one,甚至使用 PHP 生成的令牌在 ajax 调用中传递到数据,只接受一个 ajax 函数的调用,如下所示:

Html: <a class="obfmail" href="#" rel="info" token="w3487ghdr6rc">

Jquery:

...
addr = a.attr('rel');
tkn  = a.attr('token');
$.ajax({
data: {
email: addr,
token: tkn
}, ...

.

也可以对返回的电子邮件地址进行编码或将其反转。

.

电话号码也很好用!

Cloudflare 现在提供免费的 电子邮件模糊处理服务。如果您使用 Cloudlfare.Cloudflare,这可能是一个选项。

因为这个解决方案在任何地方都没有提到,但对我来说很有效:

我这样做:

  • 创建一个假邮件链接。我喜欢 admin@localhost.localdomain 的原因很明显: 垃圾邮件发送者可能在未经检查的情况下使用这个地址发送垃圾邮件给他自己的僵尸网络。

  • 加密真实的电子邮件地址,并把它放在一个不相关的,但可以找到的隐藏范围或任何元素,你喜欢。显然是为了混淆邮件,不让收割者看到。根据项目结构的不同,您甚至可能希望将其放在 JS 或 Session 变量中。

  • 为这些链接创建一个点击处理程序后,第二次破译和写入正确的电子邮件地址到假邮件链接不防止默认。 我不认为爬虫会点击 mailto 链接,但如果他们会,他们可能不会等待一秒钟,而人类将不得不非常快地点击一个链接在页面载入后的第一秒钟。

现在您已经有了一个功能齐全但模糊的、蜜罐式的、时间安全的 mailto 链接。

工作示例 php 文件:

<html>
<head>
<title>E-Mail Obfuscating</title>
</head>
<body>
<?php
$email = "example@email.org";
echo "<a class='emailLink' href='mailto:admin@localhost.localdomain' >Send me an e-mail!</a>"
."<span style='display:none' data-hash='" . base64_encode($email) . "' />";
?>
<script>
<!--
var emailLinks = document.getElementsByClassName("emailLink");
setTimeout(function() {
for(var i=0; i <emailLinks.length; ++i){
emailLinks[i].addEventListener("click", function(){
let encodedEmail = this.nextSibling.getAttribute('data-hash');
let decodedEmail = atob(encodedEmail);
this.href = "mailto:" + decodedEmail;
this.text = decodedEmail;
});
}
}, 1000);


-->
</script>
</body>
</html>

愿密码与你同在。

如果创建一个链接“联系我”指向一个目录的密码保护?当然,你必须给通行证才能进入。

联系我

一旦访问,contact/index.html 页面就会显示电子邮件,例如 mailto。

我的解决方案是使用 css 重新排列字符,并在鼠标悬停时替换元素。用户看不到任何更改。

const obscureHoverReverseMailTo = input => `<span style="display: inline-flex; color: rgb(0, 0, 238); cursor: pointer; text-decoration: underline;" onmouseover="const newContent = [...this.children].sort((a, b) => a.style.order - b.style.order).map(el => el.innerText).join('');this.outerHTML = \`<a href='mailto: \${newContent}'>\${newContent}</a>\`">${input.split("").map((char, index) => `<span style="order: ${index}">${char}</span>`).sort(() => 0.5 - Math.random()).join("")}</span>`;

const obscureHoverReverseMailTo = input => `<span style="display: inline-flex; color: rgb(0, 0, 238); cursor: pointer; text-decoration: underline;" onmouseover="const newContent = [...this.children].sort((a, b) => a.style.order - b.style.order).map(el => el.innerText).join('');this.outerHTML = \`<a href='mailto: \${newContent}'>\${newContent}</a>\`">${input.split("").map((char, index) => `<span style="order: ${index}">${char}</span>`).sort(() => 0.5 - Math.random()).join("")}</span>`;


document.getElementById("testRoot").innerHTML = obscureHoverReverseMailTo("hello@example.com")
<div id="testRoot"></div>


<input type="text" onkeyup="document.getElementById('testOut').innerHTML = obscureHoverReverseMailTo(this.value)">
<div id="testOut"></div>

如果你还有其他需要隐藏的东西,这里有一个函数:

const obscureHoverReverse = input => `<span style="display: inline-flex" onmouseover="this.outerHTML = [...this.children].sort((a, b) => a.style.order - b.style.order).map(el => el.innerText).join('')">${input.split("").map((char, index) => `<span style="order: ${index}">${char}</span>`).sort(() => 0.5 - Math.random()).join("")}</span>`;

我同意@srobinson 的观点,使用在线表单来编码 html 实体似乎有点不明智。几行巨蟒文字就可以做到这一点:

def htmlEntities( string ):
return ''.join(['&#{0};'.format(ord(char)) for char in string])


htmlEntities("barnstable@example.com")

上述报税表:

'&#98;&#97;&#114;&#110;&#115;&#116;&#97;&#98;&#108;&#101;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;'

它是 barnstable@example.com,编码为 HTML 实体(由单引号包围)。

不知道简单 JavaScript 的机器人通常在 HTML 页面内容中查找 mailto:和/或 @。混淆这些关键字将大大减少刮取电子邮件地址的机会。

可以使用 Base-64编码的 URL 模板 mailto:%user%@%domain%:

function contact(user, domain = location.hostname) {
const template = atob('bWFpbHRvOiV1c2VyJUAlZG9tYWluJQ==');
location.href = template
.replace('%user%', user)
.replace('%domain%', domain);
return false;
}

其中 'bWFpbHRvOiV1c2VyJUAlZG9tYWluJQ=='btoa('mailto:%user%@%domain%')

HTML 链接需要更新如下:

<a href="javascript: contact('x', 'y.com')">e-mail me</a>

此外,javascript:地址可以对用户隐藏:

<a href="#" onclick="return contact('x', 'y.com')">e-mail me</a>

return语句阻止页面导航到 #锚点。