【问题标题】:Best way to obfuscate an e-mail address on a website?在网站上混淆电子邮件地址的最佳方法是什么?
【发布时间】:2010-10-19 10:13:06
【问题描述】:

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

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

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

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

它有效,但这也意味着只要我的网站访问 Google,我就会在垃圾邮件中翻滚,因为垃圾邮件机器人很容易找出我的电子邮件地址。

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

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

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

【问题讨论】:

  • 将邮件转发到您的 GMail 帐户。 ;-)
  • 见超级用户question
  • This post 应该链接在这里。

标签: javascript html email obfuscation


【解决方案1】:

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

【讨论】:

  • 这停止了最简单的垃圾邮件收集(正则表达式查找任何与电子邮件地址相似的文本),并且没有缺点:它与明确的 href= 一样方便最终用户mailto:xxx@yy 链接。
  • 根据this empirical study from 2008,URL 编码是次要有效的。只有纯文本更糟糕。
  • 我知道这已经晚了,但值得指出的是,这里的建议是使用与 URL 编码不同的 HTML 实体。根据该研究,将实体用于 @ 和句点是第二有效的方法(最有效的是三个并列第一的方法,它们都导致 0 条垃圾邮件)。看看这在近 6 年后是否仍然成立会很有趣。
  • 我觉得讽刺的是,为了保护您的电子邮件,您必须在您链接到的网站上将其输入到一个随机的、看起来阴暗的表格中。蜜罐,有人吗? :)
  • 这个答案在 2019 年仍然有意义吗?这种混淆方法好不好?
【解决方案2】:

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

【讨论】:

  • 无论您的垃圾邮件过滤有多好,都会出现误报(不应该通过的邮件)。最终,您必须接受电子邮件地址,但这种不必要的暴露似乎会增加垃圾邮件通过的频率。
  • @Brad 根据我的经验,情况并非如此。我将 Google 托管邮件用于我的域,并且我的电子邮件地址非常很容易找到。自从我在 14 个多月前开始使用它以来,我有 0 个假阴性和 1 个假阳性。我的垃圾邮件文件夹中每天都会收到数百封垃圾邮件。
  • 呃,我应该补充一点:垃圾邮件不是会吃掉你孩子的妖怪。收到一封奇怪的垃圾邮件并不是世界末日。点击“报告垃圾邮件”并继续。
  • @Brad:如果没有必要,请不要透露您的地址。如果有必要提供您的地址,请准备好接收垃圾邮件。如果不让垃圾邮件机器人更容易做到这一点,就无法让人们轻松地向您发送电子邮件。
  • 我也只是不混淆地发布我的电子邮件。我使用 gmail,垃圾邮件过滤器似乎工作得非常好。
【解决方案3】:

当前接受的解决方案是创建一个允许用户向您发送电子邮件的联系表单。如果您从中收到大量垃圾邮件(我的网站上没有),那么您可以添加一个验证码以防万一,此时您将远离“唾手可得的果实”。

事实上,如果您提供了一个链接,用户可以单击该链接以在“收件人:”字段中使用您的地址弹出打开他们的电子邮件客户端,那么计算机就能够从页面中破译该电子邮件地址垃圾邮件机器人也可以。

【讨论】:

  • 也就是说,发送邮件的逻辑应该写在隐藏的服务器端代码中,这样地址就不会被公开。
  • 虽然这是一个很好的解决方案,但从技术上讲,它是一个让许多用户反感的解决方案。只是说。
  • 你说得对,但我一直不明白为什么。最多,您只需单击一下即可离开 Web 表单,就像您在 最少 使用电子邮件客户端时一样。唯一增加难度的是可选的验证码。如果用户无法通过它与您联系,他们的信息重要吗?
  • 我总是喜欢可以选择抄送您的消息。联系表格困扰我的一件事是它在我自己的电子邮件系统中没有留下任何记录。 (尽管抄送任何电子邮件地址的表单可能会产生一系列问题。)
  • 也没有迹象表明电子邮件表单确实有效。我见过太多无声无息的破碎。至少,真正的电子邮件会被退回。
【解决方案4】:

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

与我联系的最佳方式 在新网站上线之前是发送 我的电子邮件。我的电子邮件地址是我的 这个网站上的名字。如果你 无法从那个提示中弄清楚, 好吧,您可能会发现电子邮件更像是 挑战比弄清楚我的 地址。

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

【讨论】:

  • 这个方法也能过滤掉智商低于一定水平的人:D
【解决方案5】:

混淆锚点的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>

【讨论】:

    【解决方案6】:

    显然using CSS to change the direction of your text 工作得很好。该链接还测试了许多其他混淆方法。

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

    【讨论】:

    • 这可能会影响复制和粘贴? IIRC
    • 地址在复制粘贴时,会向后显示。如果您希望尽可能轻松地与您联系,这可能会让用户感到反感。
    【解决方案7】:

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

    【讨论】:

    • Unniloct:无论最佳答案是什么,Sam Hasler 的答案都适用。通过使用最流行的混淆技术,您将获得最有可能的目标。
    • 除非最重要的答案是不实际使用混淆:)
    • @JoshJordan:同意,我实际上投票支持你的答案。我的观点是,任何流行的混淆技术最终都会被垃圾邮件发送者注意到,他们会编写代码去混淆它。
    • 目前这个页面是谷歌返回的[混淆邮箱地址]的第28个结果,虽然我预计它最终会更高。
    • @SamHasler,是的,六年后现在是第三个结果。
    【解决方案8】:

    我的其实很简单:

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

    【讨论】:

    • 拥有 hello@gmail.com 的可怜人 :)
    • Gmail 上没有包含 5 个字符的电子邮件。
    【解决方案9】:

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

    【讨论】:

      【解决方案10】:

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

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

      功能发送电子邮件(名称,域){ location.href = 'mailto:' + 名称 + '@' + 域; }

      为确保只有启用 JS 的用户才能看到该链接,请将其写出来:

      函数 writeEmailLink(realName, name, domain) { document.write(''); document.write(realName); document.write(''); }

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

      【讨论】:

        【解决方案11】:

        我用的是JavaScript混淆,看看这个例子:

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

        【讨论】:

        • -1:你看过它生成的代码吗?如果您将其包含在“链接文本”中,它实际上不会混淆您的电子邮件地址,并且使用“mailto:”掩盖其目的。更糟糕的是,它是一个需要 Javascript 的解决方案,不应依赖于基本内容。
        【解决方案12】:

        正如上面的海报所说,我也使用来自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 网站的初衷)并带有文本“Send Me Email”,其中 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”部分

        我最终得到了这个:

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

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

          【讨论】:

          • 实施 AJAX 电子邮件加载实施所花费的时间:3 天。无需删除的垃圾邮件中节省的时间:17 分钟。
          【解决方案14】:

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

          他的三个最佳方法是:

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

          警告 -- 这是两年前发布的。垃圾邮件机器人可能变得更聪明了。

          【讨论】:

            【解决方案15】:

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

            【讨论】:

            • 我想知道为什么有人不赞成这个。解释一下会很有帮助。
            【解决方案16】:

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

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

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

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

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

            只是另一种方法。

            【讨论】:

              【解决方案17】:

              使用 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(/三/g, "3") .replace(/四/g, "4") .replace(/五/g, "5") .replace(/六/g, "6") .replace(/七/g, "7") .replace(/八/g, "8") .replace(/9/g, "9") .replace(/Zero/g, "0")) $(this).attr("href", $(this).attr("href") .replace("...", "@").replace(/\.\.\./g, ".") .replace(/One/g, "1") .replace(/Two/g, "2") .replace(/三/g, "3") .replace(/四/g, "4") .replace(/五/g, "5") .replace(/六/g, "6") .replace(/七/g, "7") .replace(/八/g, "8") .replace(/9/g, "9") .replace(/Zero/g, "0")) })

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

              de/obfuscation 算法非常简单,所以写起来也不会太费力(不需要 base64 解析)

              【讨论】:

                【解决方案18】:

                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) { 甚至使用 PHP 生成的令牌,您在 ajax 调用时传递到数据中,只接受一次这样的 ajax 函数调用:

                html:&lt;a class="obfmail" href="#" rel="info" token="w3487ghdr6rc"&gt;

                jquery:

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

                .

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

                .

                电话号码也能正常工作!

                【讨论】:

                  【解决方案19】:

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

                  【讨论】:

                    【解决方案20】:

                    老实说,如果您问的是 mailto 是否真的是您想要使用的东西,那么您的问题可能没有实际意义。例如,许多使用 Web 邮件或在浏览器中没有正确设置邮件客户端的人不会从 mailto 中受益。您正在公开您的电子邮件地址以实现对大部分用户不起作用的功能。

                    您可以做的是使用表单在幕后发送电子邮件,以便隐藏电子邮件地址,您不必担心不会从 mailto 中受益的可怜的 sap .

                    【讨论】:

                      【解决方案21】:

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

                      【讨论】:

                      • 在成熟的电子邮件中实际上不允许使用括号吗?似乎这可能是一个有效的电子邮件地址。 :p
                      • 这是垃圾邮件机器人错过您收件箱的另一个原因。 :-)
                      【解决方案22】:

                      如果有人在使用 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 。在电子邮件中 作为值给出的字符串。

                      【讨论】:

                        【解决方案23】:
                        <!-- 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>
                        

                        【讨论】:

                          【解决方案24】:

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

                          我这样做:

                          • 使用虚假电子邮件创建 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】:

                            如果创建指向受密码保护的目录的“联系我”链接怎么办?当然,您必须提供通行证才能访问。

                            “联系我” > ••••••••••• > 联系人/index.html

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

                            【讨论】:

                              【解决方案26】:

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

                                我同意@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】:

                                  不知道 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】:

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

                                    您还可以使用下面这个 sn-p 的链接函数来自动混淆某些给定 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);
                                     }
                                    

                                    【讨论】:

                                    • 你在哪里定义了 createJSMailLink()?
                                    【解决方案30】:

                                    签出this

                                    “Enkoder 表单”将加密您的电子邮件地址并将结果转换为自我评估的 JavaScript,将其隐藏在爬网寻找暴露地址的电子邮件收集机器人之外。网络浏览器会正确显示您的地址,但电子邮件收集机器人几乎无法辨认。

                                    【讨论】:

                                      猜你喜欢
                                      • 2021-02-24
                                      • 2012-08-07
                                      • 2013-04-20
                                      • 2011-05-05
                                      • 2011-06-14
                                      • 2016-06-28
                                      • 2019-01-22
                                      • 1970-01-01
                                      • 2013-05-13
                                      相关资源
                                      最近更新 更多