如何在网站上最好地混淆电子邮件地址?

157

最近几天我一直在更新我的个人网站。我的个人网站的URL是(my first name).(my last name).com,因为我的姓非常不寻常,所以我很幸运地得到了这个域名。我的电子邮件地址是(my first name)@(my last name).com。所以实际上,如果要猜测它,这并不难。

无论如何,我想将mailto:链接集成到我的网站中,这样人们就可以联系我。尽管我的电子邮件地址并不难猜测,但我还是不想让它被垃圾邮件机器人收集,这些机器人会扫描网站以查找电子邮件地址模式,并将它们添加到它们的数据库中。

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

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

它能够运作,但这也意味着一旦我的网站被Google收录,我就会被垃圾邮件淹没,因为垃圾邮件机器人可以轻松地找到我的电子邮件地址。

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

这种方式不太理想,因为访问者不能单击它向我发送电子邮件,而更聪明的垃圾邮件机器人可能能够检测到图像中包含的字符。

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


11
将此信息转发到您的GMail帐户。;-) - Dave Jarvis
1
请查看超级用户问题 - jacktrades
应该在这里链接此帖子 - Clément
30个回答

120

我将字符编码为HTML实体(类似于这样)。它不需要启用JS,似乎已经阻止了大部分垃圾邮件。我想聪明的机器人可能仍然能够收集它,但是我没有遇到过任何问题。


6
这将阻止最简单的垃圾邮件机器人收集(使用正则表达式查找任何类似电子邮件地址的文本),并且没有任何负面影响:对于最终用户来说,它与明确的href=mailto:xxx@yy链接一样方便。 - Stephen C. Steel
45
根据这篇2008年的实证研究,URL编码是次佳的方法,只有纯文本比它更差。 - Fuhrmanator
21
我知道现在有些晚了,但我觉得有必要指出这里的建议是使用HTML实体,这与URL编码不同。根据该研究,对于@和句点,使用实体是第二有效的方法(最有效的是三种方法并列第一,都没有垃圾邮件)。如果现在将其应用,是否仍然成立值得探讨。 - Bailey Parker
14
我觉得很讽刺,为了保护你的电子邮件,你必须将它输入到你提供链接的某个看起来可疑的随机表格中。诱骗攻击,有人听说过吗? :) - srobinson
6
这个答案在2019年后是否仍然有参考价值?这种混淆方法好吗? - Sekhemty
显示剩余5条评论

87

个人而言,我已经放弃了隐藏我的电子邮件地址。我发现寻找更好的垃圾邮件过滤解决方案比担心混淆更容易。你可以花费数天时间尝试找到最佳混淆方法,但只需要一个人将你的地址出售给垃圾邮件发送者,所有工作都将变得毫无意义。


1
无论您的垃圾邮件过滤有多好,都会出现假阴性(应该被拦截但未被拦截的邮件)。最终,您必须接受电子邮件地址,但这种不必要的公开似乎会增加垃圾邮件被发送的频率。 - Brad Barker
8
根据我的经验,这并非事实。我使用谷歌托管的邮件服务来处理我的域名邮件,我的电子邮件地址非常容易找到。自从我在14个月前开始使用以来,我没有收到1个误判垃圾邮件,但在我的垃圾邮件文件夹中每天会有数百封垃圾邮件。 - Rex M
我在Gmail中得到了许多错误的负面反馈。你的情况可能会有所不同。 - eyelidlessness
9
额,我应该补充一下:垃圾邮件不是会吃掉你的孩子的鬼怪。收到奇怪的垃圾邮件并不是世界末日。点击“报告垃圾邮件”然后继续前进。 - eyelidlessness
1
@Brad:如果不必要,就不要公开你的地址。如果必须提供你的地址,那么准备好迎接垃圾邮件的到来吧。你不能让人类轻松地给你发电子邮件,而不让垃圾邮件机器人也能轻松地做到。 - Chuck
1
我刚刚发布了我的未经混淆的电子邮件地址。我使用Gmail,并且垃圾邮件过滤功能似乎非常出色。 - Asmor

70

目前被广泛认可的解决方案是创建一个联系表格,允许用户通过电子邮件与您联系。如果您从中接收大量垃圾邮件(在我的网站上没有出现这种情况),则可以添加验证码以加强安全措施,这样您的网站就不是“低 hanging fruit”了。

事实上,如果您提供一个链接,让用户点击打开他们的邮件客户端并将您的地址填写在“收件人”字段中,那么计算机可以从页面中解密出电子邮件地址,垃圾邮件机器人也可以做到。


2
也就是说,发送电子邮件的逻辑应该编写在隐藏的服务器端代码中,以便地址永远不会公开。 - JoshJordan
11
虽然从技术上讲这是一个好的解决方案,但它会让许多用户感到不舒服。只是说一下。 - eyelidlessness
16
我总是很喜欢在发邮件时有抄送你的选项。联系表格唯一让我困扰的是它不会在我的电子邮件系统中留下任何记录。(虽然一个可以抄送任何电子邮件地址的表格也可能会带来其他问题。) - Sam Hasler
6
没有迹象表明电子邮件表单实际起作用。我见过太多无声破损的表单。真正的电子邮件至少会被退回。 - Brian Carper
@EstanislaoStan 垃圾邮件/滥用 - Sam Hasler
显示剩余5条评论

47
您提到这是为您的个人网站而设。在我的个人网站上(例如,bobsomers.com),我只有一个段落,其中写着:

在新网站启用之前与我联系最好的方法是通过电子邮件发送给我。我的电子邮件地址是我的名字加上该网站的域名。如果您无法从此提示中找到我的电子邮件地址,那么您可能会发现电子邮件比找到我的地址更具挑战性。

人们似乎能够很好地理解这一点,因为我经常收到合法的电子邮件。有时最好的解决方案并不需要编写任何代码 :)


12
这种方法还会筛选出智商低于一定水平的人:D - papa zulu

34

一种轻量级的混淆锚点 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>

请注意,React 在设置 href 时会显示警告,如下所示:警告:未来版本的 React 将阻止 javascript: URL 作为安全预防措施。如果可以,请改用事件处理程序。如果需要生成不安全的 HTML,请尝试使用 dangerouslySetInnerHTML。React 被传递了 "javascript:window.location.href=atob(base64String)"。 - fredrivett

15

显然,使用CSS改变文本方向非常有效。该链接还测试了许多其他混淆方法。

无论你使用什么方法,都将不可避免地被攻破。你的主要目标应该是避免让用户感到恼火。


6
这会破坏复制和粘贴的功能吗?如我所记得的。 - alex
8
当地址被复制粘贴时,它将会倒序显示。如果您希望尽可能方便用户联系您,这可能会让他们感到困惑。 - Christian Davén

12

不要在此处使用任何混淆技术,因为这很可能是电子邮件收割者查找人们如何混淆电子邮件的首要地点。如果必须在网站上公开您的电子邮件地址,请不要简单地抄袭其他人的方法;以一种独特的方式混淆它,这样其他网站就没有使用过,使得在他们访问您的网站之前,他们不会知道您的方法。


1
Unniloct:Sam Hasler的回答适用于无论最佳答案是什么。选择最流行的混淆技术,意味着你选择了最有可能被收集的目标。 - eyelidlessness
除非最佳答案是不要使用混淆 :) - JoshJordan
@JoshJordan:同意,我实际上投了你的答案。我的观点是,任何流行的混淆技术最终都会被垃圾邮件发送者注意到,并编写代码进行反混淆。 - Sam Hasler
2
目前这个页面是谷歌搜索“混淆电子邮件地址”返回的第28个结果,尽管我预计它最终会上升更高。 - Sam Hasler
1
@SamHasler,没错,六年后现在它已经成为第三个结果了。 - user1919238
它在第二名!(y) - Pedro Ferreira

11

我的实际上很简单:

<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>');
    });

18
那个拥有hello@gmail.com的可怜人 :) - duedl0r
3
Gmail上没有5个字符的电子邮件。 - Paulo Ney

8
你可以像谷歌在Google Code(和Groups)上那样做。显示电子邮件的一部分和可点击的部分(“...”)。点击表示你想知道电子邮件,然后会要求你填写验证码。之后,你可以看到电子邮件(和其他电子邮件?)。

7

我维护的一个网站使用了一种相对简单的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函数写出调用另一个函数的链接,这意味着有两层保护。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接