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

时间:2009-04-14 18:24:48

标签: javascript html email obfuscation

过去几天我一直在努力更新我的个人网站。我的个人网站的URL是(我的名字)。(我的姓).com,因为我的姓氏很不寻常,我很幸运能够拿起域名。我的电子邮件地址是(我的名字)@(我的姓).com。所以真的,当它归结为猜测它时,它并不是很难。

无论如何,我想将mailto:link集成到我的网站,以便人们可以联系我。而且,尽管我的电子邮件地址不是很难猜测,但我宁愿不让垃圾邮件机器人收集它,只是抓取网站的电子邮件地址模式并将它们添加到他们的数据库中。

对我来说,最好的方法是混淆我的电子邮件地址,最好是链接形式?我所知道的方法是:

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

它有效,但这也意味着一旦我的网站访问谷歌,我就会涉及垃圾邮件,因为垃圾邮件机器人可以轻松地选择我的电子邮件地址。

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

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

我知道可能没有完美的解决方案,但我只是想知道每个人都认为最好的。我绝对愿意在必要时使用JavaScript,因为我的网站已经使用了大量的JavaScript。

31 个答案:

答案 0 :(得分:97)

我将字符编码为HTML实体(something like this)。它不需要启用JS,似乎已经停止了大部分垃圾邮件。我想智能机器人可能仍会收获它,但我没有遇到任何问题。

答案 1 :(得分:81)

就个人而言,我已经放弃了隐藏我的电子邮件地址。我发现更容易研究更好的垃圾邮件过滤解决方案而不是担心混淆。您可能需要花费数天的时间来寻找混淆地址的最佳方法,然后只需要一个人将您的地址卖给垃圾邮件发送者,所有这些工作都是无用的。

答案 2 :(得分:66)

目前接受的解决方案是创建一个允许用户通过电子邮件发送给您的联系表单。如果你从那里收到大量的垃圾邮件(我不在我的网站上),那么你可以添加一个验证码,并且你将远离那个“低悬的果实”。

事实是,如果您提供的链接可以让用户点击以打开他们的电子邮件客户端,并在“收件人:”字段中显示您的地址,那么计算机就可以从该页面解密该电子邮件地址垃圾邮件机器人也是如此。

答案 3 :(得分:41)

您提到这是针对您的个人网站的。在我的个人网站上(例如,bobsomers.com)我只有一段说明:

  

与我联系的最佳方式   在新网站启动之前是发送   我是一封电子邮件我的电子邮件地址是我的   本网站的名字。如果你   无法从那个提示中弄明白,   好吧,你可能会发现更多的电子邮件   挑战而不是弄清楚我的   地址。

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

答案 4 :(得分:36)

reCAPTCHA提供了一个简单的email obfuscation service。您无需设置帐户即可立即开始使用。您可以将该服务用作链接或弹出窗口。

验证码解决后,您的电子邮件地址显示为href / mailto,以便配置其电子邮件客户端以使用其浏览器的用户可以点击/跟踪它。

答案 5 :(得分:14)

显然using CSS to change the direction of your text效果很好。该链接还测试了一堆其他混淆方法。

无论你使用什么,都不可避免地会被打败。您的主要目标应该是避免让用户烦恼。

答案 6 :(得分:13)

一种模糊锚点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>

答案 7 :(得分:12)

这里不要使用任何混淆技术,因为它可能是电子邮件收集者首先查找人们如何混淆电子邮件的第一个地方。如果您必须在网站上显示您的电子邮件地址,请不要只是逐字复制其他人的方法;以某种独特的方式混淆它,没有其他网站使用过,以便收割者在访问您的网站之前不会知道您的方法。

答案 8 :(得分:8)

你可以像谷歌那样在谷歌代码(和群组)上做。显示电子邮件的标准和可点击的部分(“...”)。单击表示您想要知道该电子邮件,并要求您填写验证码。之后,您可以看到电子邮件(以及其他人?)。

答案 9 :(得分:6)

我使用JavaScript混淆,例如看看这个:

http://www.jottings.com/obfuscator/

答案 10 :(得分:6)

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

答案 11 :(得分:6)

我真的很简单:

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

答案 12 :(得分:4)

如上面的海报所述,我还使用jottings website中的JavaScript混淆。

网页会生成一些可以改进的JavaScript。 mailto:文字字符串是明确的,可由机器人识别(可以发现此字符串并对此字符串进行取消混淆),但如果有人在jottings.com网页上输入mailto:addr@site.tld形式的电子邮件地址而不是addr@site.tld然后从生成的JavaScript中删除文本mailto:,突然有一些JavaScript看起来好像与电子邮件完全无关 - 只是随机JavaScript的网络已满。通过删除链接文本可以进一步改善这一点 - 我用我的电子邮件地址的图像替换了我的,这是一个相当模糊的字体。然后,为了防止jottings.com上的这个方法变得流行,我将输出JavaScript中的变量名称随机化,使机器人很难发现jottings生成JavaScript代码的实例。

显然,这些改进中的一些可以构建到记录本身的机制中,并且由于代码是公开可用的,因此这将相对容易。

一个例子可能会使这一点更清楚。我在上面的链接中使用了Jottings Obfuscator来模糊mailto:foo@bar.com(注意我通过输入字符串mailto:foo@bar.com而不是foo@bar.com来欺骗jottings网站的原始意图)并使用文本“发送”我发送电子邮件“,其中记录了这个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”部分替换为指向电子邮件地址图像的其他链接
  5. 我最终得到了这个:

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

答案 13 :(得分:3)

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

答案 14 :(得分:2)

一个人测试了九种不同的方式在页面上显示电子邮件地址,然后在他的博客上published results

他最好的三个方法是:

  1. 使用CSS更改代码方向
  2. 使用CSS display:none
  3. ROT13加密
  4. 警告 - 这是两年前发布的。垃圾邮件机器人可能会变得更聪明。

答案 15 :(得分:1)

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

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

插值{{data}}绑定使用包含实际电子邮件值的范围变量。此外,还可以使用过滤器来处理电子邮件的解码,如下所示:

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

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

只是另一种方法。

答案 16 :(得分:1)

Ajax呼叫解决方案

最好是在网站上有一个表格,而不是显示电子邮件地址,因为所有机器人日复一日都更聪明,但如果你需要在网站上显示电子邮件地址,那么,你可以用ajax制作它呼叫您的服务器,并在点击时显示它。

<强> HTML

<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,如$(document).one('click', '.obfmail', function(e) {,或者使用您在ajax调用中传递给数据的PHP生成令牌,只接受一次调用像这样的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
    }, ...

  

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

  

也适用于电话号码!

答案 17 :(得分:0)

如果您在您的网站上说“我的电子邮件地址是(我的名字)@(我的姓氏).com。”,并且您的名字和姓氏非常明显,那似乎是最好的垃圾邮件保护。

答案 18 :(得分:0)

如果您使用PHP,您可以获取一个自动执行该操作的免费脚本。它被称为“私人爸爸”,我们将它用于我们自己的在线音频流服务。只需一行代码即可开箱即用......你可以抓住它here

答案 19 :(得分:0)

如果有人使用Rails,他们可以使用actionview-encoded_mail_to gem。 (https://github.com/reed/actionview-encoded_mail_to

有几个选择:

  

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

     

:replace_at - 当没有提供链接名称时,   email_address用于链接标签。您可以使用此选项   通过用字符串替换@符号来混淆email_address   作为价值给出。

     

:replace_dot - 未提供链接名称时   email_address用于链接标签。您可以使用此选项   通过替换来混淆email_address。在电子邮件中   作为值给出的字符串。

答案 20 :(得分:0)

<!-- 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>

答案 21 :(得分:0)

老实说,如果您询问mailto是否真的是您想要使用的问题,那么您的问题可能没有实际意义。例如,许多使用网络邮件或在浏览器中没有正确的邮件客户端设置的人都不会受益于mailto。您正在公开您的电子邮件地址,以查找不适合大部分用户的功能。

你可以做的是使用表格在幕后发送电子邮件,以便隐藏电子邮件地址,你不必担心那些不会从邮件中受益的可怜的人

答案 22 :(得分:0)

使用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/

de /混淆算法非常简单,因此它不会太费力而无法编写(不需要base64解析)

答案 23 :(得分:0)

Cloudflare现在提供免费的email obfuscation service。如果您使用Cloudlfare,这可能是一个选项。

答案 24 :(得分:0)

由于此解决方案未在任何地方提及,但对我来说效果很好:

我这样做:

  • 使用虚假电子邮件创建mailto链接。我喜欢使用admin@localhost.localdomain的原因很明显:垃圾邮件发送者在未经检查的情况下使用此地址可能会将自己的僵尸网络作为垃圾邮件。

  • 密码真实的电子邮件地址,并将其放在不相关但可找到的隐藏范围或您喜欢的任何元素中。显然是要混淆电子邮件并将其对收割机隐藏。根据您的项目结构,您甚至可能希望将其放在JS或Session变量中。

  • 在一秒钟后为这些链接创建一个单击处理程序,以使其解密,并将正确的电子邮件地址写入伪造的mailto链接中,这不会阻止默认设置。 我认为爬网程序不会单击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>

希望代码与您同在。

答案 25 :(得分:0)

如果创建指向受密码保护的目录的链接“与我联系”怎么办?当然,您必须授予通行证。

“与我联系”>•••••••••••> contact / index.html

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

答案 26 :(得分:0)

我的解决方案是使用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>`;

答案 27 :(得分:0)

我同意@srobinson的观点,即使用在线表单对html实体进行编码似乎有点阴暗。几行python可以为您做到这一点:

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实体(用单引号引起来)。

答案 28 :(得分:0)

不知道 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 语句阻止页面导航到 # 锚点。

答案 29 :(得分:-1)

我使用PHP function生成一些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);
 }

答案 30 :(得分:-2)

检查this

'Enkoder表单'将加密您的电子邮件地址,并将结果转换为自我评估的JavaScript,将其隐藏在电子邮件收集机器人中,该机器人抓取网络以查找公开的地址。您的地址将通过网络浏览器正确显示,但对于电子邮件收集机器人来说几乎无法解读。