从垃圾邮件机器人隐藏电子邮件的有效方法

时间:2009-01-27 12:25:55

标签: html algorithm email spam

在我的主页上,我正在使用此方法隐藏垃圾邮件机器人的电子邮件:

<a href="admin [at] example.com"
   rel="nofollow"
   onclick="this.href='mailto:' + 'admin' + '@' + 'example.com'">Contact me</a>

你怎么看?有效吗?你知道或使用了哪些其他方法?

34 个答案:

答案 0 :(得分:93)

这是我使用的方法,服务器端包括,例如<!--#include file="emailObfuscator.include" -->其中emailObfuscator.include包含以下内容:

<!-- // http://lists.evolt.org/archive/Week-of-Mon-20040202/154813.html -->
<script type="text/javascript">
    function gen_mail_to_link(lhs,rhs,subject) {
        document.write("<a href=\"mailto");
        document.write(":" + lhs + "@");
        document.write(rhs + "?subject=" + subject + "\">" + lhs + "@" + rhs + "<\/a>");
    }
</script>

要包含地址,我使用JavaScript:

<script type="text/javascript"> 
    gen_mail_to_link('john.doe','example.com','Feedback about your site...');
</script>
<noscript>
  <em>Email address protected by JavaScript. Activate JavaScript to see the email.</em>
</noscript>

因为自2005年以来我一直通过Gmail收到电子邮件,垃圾邮件几乎不是问题。所以,我不能说这种方法有多有效。您可能希望阅读产生此图表的this study(尽管它已经过时了):

enter image description here

答案 1 :(得分:82)

看看this way,非常聪明并使用css。

<强> CSS

span.reverse {
  unicode-bidi: bidi-override;
  direction: rtl;
}

HTML

<span class="reverse">moc.rehtrebttam@retsambew</span>

然后,上面的CSS将覆盖阅读方向,并以正确的顺序将文本呈现给用户。

希望有所帮助

干杯

答案 2 :(得分:73)

使用CSS中的内容和attr:

.cryptedmail:after {
  content: attr(data-name) "@" attr(data-domain) "." attr(data-tld); 
}
<a href="#" class="cryptedmail"
   data-name="info"
   data-domain="example"
   data-tld="org"
   onclick="window.location.href = 'mailto:' + this.dataset.name + '@' + this.dataset.domain + '.' + this.dataset.tld; return false;"></a>

当禁用javascript时,只有点击事件无效,电子邮件仍会显示。

另一个有趣的方法(至少没有点击事件)是利用从右到左的标记来覆盖书写方向。更多关于这一点:https://en.wikipedia.org/wiki/Right-to-left_mark

答案 3 :(得分:52)

我对此有完全不同的看法。我为此使用了MailHide

MailHide是Google的一个系统,用户需要完成reCAPTCHA测试,然后向他们显示电子邮件。

答案 4 :(得分:45)

最初不是我的想法,但我无法找到作者:

<a href="mailto:coxntact@domainx.com"
    onmouseover="this.href=this.href.replace(/x/g,'');">link</a>

添加尽可能多的x&#39; s。它非常适合阅读,复制和粘贴,并且无法被机器人读取。

答案 5 :(得分:16)

我认为您唯一可以使用的万无一失的方法是创建一个“联系我”页面,该页面是一个提交到发送到您的电子邮件地址的脚本的表单。这样,您的地址根本不会暴露给公众。出于某种原因,这可能是不合需要的,但我认为这是一个非常好的解决方案。当我被迫将某人的电子邮件地址从他们的网站复制/粘贴到我的邮件客户端并向他们发送消息时,它经常让我感到烦恼;我宁愿通过他们网站上的表单来做到这一点。此外,这种方法允许您发送匿名评论,等等。请确保使用某种反机器人方案保护您的表单,例如验证码。这里讨论了很多关于SO的内容。

答案 6 :(得分:15)

请参阅Making email addresses safe from bots on a webpage?

我喜欢Facebook和其他人呈现您的电子邮件地址图片的方式。

我过去也曾使用The Enkoder - 认为说实话是非常好的!

答案 7 :(得分:10)

如果你有php支持,你可以这样做:

<img src="scriptname.php">

以及scriptname.php:

<?php
header("Content-type: image/png");
// Your email address which will be shown in the image
$email    =    "you@yourdomain.com";
$length    =    (strlen($email)*8);
$im = @ImageCreate ($length, 20)
     or die ("Kann keinen neuen GD-Bild-Stream erzeugen");
$background_color = ImageColorAllocate ($im, 255, 255, 255); // White: 255,255,255
$text_color = ImageColorAllocate ($im, 55, 103, 122);
imagestring($im, 3,5,2,$email, $text_color);
imagepng ($im);
?>

答案 8 :(得分:10)

我知道我的答案不会受到很多人的喜爱,但在翻阅之前请先考虑一下这里列出的要点。

任何易于机器读取的内容都很容易被垃圾邮件发送者读取。尽管他们的行为对我们来说似乎很愚蠢,但他们并不是愚蠢的人。他们具有创新能力和资源。他们不只是使用机器人来收集电子邮件,他们有大量的方法供他们使用,除此之外,他们只需支付新的电子邮件清单。这意味着,他们在全球范围内有成千上万的黑帽黑客来执行他们的工作。人们准备编写恶意软件,以刮擦其他人的屏幕。浏览器最终会呈现您尝试实现无用的任何方法。这个帖子已被10多个这样的人读过,他们正在嘲笑我们。他们中的一些人可能甚至无聊地流泪,发现我们无法对他们提出新的挑战。

请记住,您最终并没有尝试节省您的时间,而是节省其他人的时间。因此,请考虑在此花些时间。没有易于执行的魔术子弹可行。如果你在一家发行100个人的公司工作。网站上的电子邮件,每人每天可以减少1封垃圾邮件,我们每年都在谈论36500封垃圾邮件。如果删除这样的电子邮件平均需要5秒钟,我们每年约50个工作小时。更不用说减少烦恼了。那么,为什么不花几个小时呢?

不仅是您和接收电子邮件的人将时间视为资产。因此,您必须找到一种以这种方式模糊电子邮件地址的方法,它不会为了破解它而付出代价。如果你使用一些广泛使用的方法来混淆电子邮件,那么破解它真的是值得的。因此,如果不是数十或数十万封新鲜的电子邮件,那么饼干将会获得成千上万的信息。对他们来说,他们会得到钱。

所以,继续编写自己的方法。这是一个罕见的情况,重新发明轮子真的得到回报。使用一种非机器可读的方法,最好在不牺牲用户体验的情况下进行一些用户交互。

我花了大约20分钟来编写一个我的意思的例子。在这个例子中,我使用KnockoutJS只是因为我喜欢它而且我知道你不可能自己使用它。但无论如何它都无关紧要。它是一种未广泛使用的定制解决方案。破解它不会为这样做提供奖励,因为这样做只会在广阔的互联网上的单个页面上起作用。

这里是小提琴:http://jsfiddle.net/hzaw6/

下面的代码并不是一个好代码的例子。但只是快速的代码示例,很难让机器弄清楚我们甚至在这里处理电子邮件。即使可以做到,也不会为大规模执行而付出代价。

是的,我确实知道它不适用于IE = lte8,因为“无法获得属性&#39;属性&#39;未定义或空引用&#39;但我根本不在乎,因为它只是一个方法的演示,而不是实际的实现,并不打算用于生产。随意编写自己的代码,这是更酷,技术上更坚固等。

哦,从来没有用html或javascript命名邮件或电子邮件。对于任何名为邮件或电子邮件的东西来说,抓住DOM和窗口对象太容易了,并检查它是否包含与电子邮件匹配的内容。这就是为什么您不希望任何包含电子邮件的变量的完整形式,这也是您希望用户在分配此类变量之前与页面进行交互的原因。如果您的javascript对象模型包含DOM就绪状态的任何电子邮件地址,那么您将它们暴露给垃圾邮件发送者。

HTML:

<div data-bind="foreach: contacts">
    <div class="contact">
        <div>
            <h5 data-bind="text: firstName + ' ' + lastName + ' / ' + department"></h5>
            <ul>
                <li>Phone: <span data-bind="text: phone"></span></li>
                <li><a href="#999" data-bind="click:$root.reveal">E-mail</a> <span data-bind="visible: $root.msgMeToThis() != ''"><input class="merged" data-bind="value: mPrefix" readonly="readonly" /><span data-bind="text: '@' + domain"></span></span></li>
            </ul>
        </div>
    </div>
</div>

JS

function ViewModel(){
    var self = this;

    self.contacts = ko.observableArray([
        { firstName:'John', mPrefix: 'john.doe', domain: 'domain.com', lastName: 'Doe', department: 'Sales', phone: '+358 12 345 6789' },
        { firstName:'Joe', mPrefix: 'joe.w', domain: 'wonder.com', lastName: 'Wonder', department: 'Time wasting', phone: '+358 98 765 4321' },
        { firstName:'Mike', mPrefix: 'yo', domain: 'rappin.com', lastName: 'Rophone', department: 'Audio', phone: '+358 11 222 3333' }
    ]);
    self.msgMeToThis = ko.observable('');
    self.reveal = function(m, e){
        var name = e.target.attributes.href.value;
        name = name.replace('#', '');
        self.msgMeToThis(name);
    };
}
var viewModel = new ViewModel();
ko.applyBindings(viewModel);

答案 9 :(得分:7)

您可以尝试使用hexa中的 html实体隐藏字符(例如:&amp;#x40 for @)。 这是一个方便的解决方案,因为正确的浏览器会将其翻译,您可以拥有正常的链接。 缺点是机器人可以理论上翻译它,但它有点不寻常。 我用它来保护我博客上的电子邮件。

另一个解决方案是使用javascript 来组合部分地址并即时解码地址。 缺点是禁用javascript的浏览器不会显示您的地址。

最有效的解决方案是使用图片,但用户必须手动复制地址。

您的解决方案非常好,因为您只为已禁用javascript的用户添加了一个缺点(手动编写@)。 您也可以通过以下方式获得更加安全:

onclick="this.href='mailto:' + 'admin' + '&#x40;' + 'domain.com'"

答案 10 :(得分:7)

我最喜欢的方法之一是使用php来混淆电子邮件地址,一个典型的例子是将字符转换为HEX值,如下所示:

function myobfiscate($emailaddress){
 $email= $emailaddress;                
 $length = strlen($email);                         
 for ($i = 0; $i < $length; $i++){                
 $obfuscatedEmail .= "&#" . ord($email[$i]).";";
 }
 echo $obfuscatedEmail;
}

然后在我的标记中,我将简单地称之为:

<a href="mailto:<?php echo myobfiscate('someone@somewhere.com')" title="Email me!"><?php echo myobfiscate('someone@somewhere.com');</a>

然后检查你的来源,你会惊喜万分!

答案 11 :(得分:5)

Spambots不会解释这个,因为它是一个鲜为人知的方法:)

首先,定义css:

email:before {
    content: "admin";
}

email:after {
    content: "@example.com";
}

现在,只要您想要显示电子邮件,只需插入以下HTML:

<div id="email"></div>

tada!

答案 12 :(得分:4)

我使用CSS和jQuery的非常简单的组合,它可以正确地向用户显示电子邮件地址,并且在点击或悬停锚点时也可以使用:

HTML:

<a href="mailto:me@example.spam" id="lnkMail">moc.elpmaxe@em</a>

CSS:

#lnkMail {
    unicode-bidi: bidi-override;
    direction: rtl;
}

jQuery的:

$('#lnkMail').hover(function(){
    // here you can use whatever replace you want
    var newHref = $(this).attr('href').replace('spam', 'com');
    $(this).attr('href', newHref);
});

Here是一个有效的例子。

答案 13 :(得分:3)

一个简单的解决方案是使用HTML实体而不是实际字符。 例如,“me@example.com”将转换为:

<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#109;&#101;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;">email me</A>

答案 14 :(得分:3)

这是我的工作版本:

使用后备文本在某处创建容器:

RedirectMatch 301 /dir/subdir/safety-program/(.*) /dir/subdir/safety-program/$1

在DOM的底部(w.r.t.渲染)添加以下代码段:

<div id="knock_knock">Activate JavaScript, please.</div>

它将生成的超链接添加到指定的容器:

<script>
  (function(d,id,lhs,rhs){
    d.getElementById(id).innerHTML = "<a rel=\"nofollow\" href=\"mailto"+":"+lhs+"@"+rhs+"\">"+"Mail"+"<\/a>";
  })(window.document, "knock_knock", "your.name", "example.com");
</script>

此外,这是一个缩小版本:

<div id="knock_knock"><a rel="nofollow" href="your.name@example.com">Mail</a></div>

答案 15 :(得分:3)

! - 添加它作为参考,不知道信息可能过时,但它讲述了一些不需要使用任何脚本的简单解决方案

在我自己搜索之后,我遇到了这个页面,但也看到了这些页面:

http://nadeausoftware.com/articles/2007/05/stop_spammer_email_harvesters_obfuscating_email_addresses

尝试撤消电子邮件地址

纯HTML示例:

<bdo dir="rtl">moc.elpmaxe@nosrep</bdo>
Result : person@example.com

使用CSS的效果相同

CSS:
.reverse { unicode-bidi:bidi-override; direction:rtl; }
HTML:
<span class="reverse">moc.elpmaxe@nosrep</span>
Result : person@example.com

将此与前面提到的任何方法相结合甚至可以使其更有效

答案 16 :(得分:2)

一种可能性是使用isTrusted属性(JavaScript)。

事件接口的isTrusted只读属性是一个布尔值 当事件是由用户操作生成时为true,否则为false 通过脚本创建或修改事件或通过以下事件调度事件时 EventTarget.dispatchEvent()。

例如您的情况:

getEmail() {
  if (event.isTrusted) {
    /* The event is trusted */
    return 'your-email@domain.com';
  } else {
    /* The event is not trusted */
    return 'chuck@norris.com';
  }
}

⚠IE不兼容!

从文档中获取更多信息:https://developer.mozilla.org/en-US/docs/Web/API/Event/isTrusted

答案 17 :(得分:2)

我是SpamSpan的粉丝 - 它是混淆的,但如果JS被禁用,仍然可以辨认。它似乎也有效,尽管我在流量低的网站上只使用了大约一年。

如果需要,Drupal还有一个模块可以自动将电子邮件转换为SpamSpans。

答案 18 :(得分:2)

隐藏电子邮件地址的最佳方法只有在机器人程序员发现这种“编码”并实现解密算法之后才会有效。

JavaScript选项不会很长,因为有很多抓取工具解释JavaScript。

没有答案,imho。

答案 19 :(得分:2)

可能有机器人将[at]和其他伪装识别为@符号。所以这不是一个非常有效的方法。

当然,您可以使用URL编码或HTML字符引用(或两者)等编码:

// PHP example
// encodes every character using URL encoding (%hh)
function foo($str) {
    $retVal = '';
    $length = strlen($str);
    for ($i=0; $i<$length; $i++) $retVal.=sprintf('%%%X', ord($str[$i]));
    return $retVal;
}
// encodes every character into HTML character references (&#xhh;)
function bar($str) {
    $retVal = '';
    $length = strlen($str);
    for ($i=0; $i<$length; $i++) $retVal.=sprintf('&#x%X;', ord($str[$i]));
    return $retVal;
}

$email = 'user@example.com';
echo '<a href="'.bar('mailto:?to=' . foo(','.$email.'')).'">mail me</a>';

// output
// <a href="&#x6D;&#x61;&#x69;&#x6C;&#x74;&#x6F;&#x3A;&#x3F;&#x74;&#x6F;&#x3D;&#x25;&#x32;&#x43;&#x25;&#x37;&#x35;&#x25;&#x37;&#x33;&#x25;&#x36;&#x35;&#x25;&#x37;&#x32;&#x25;&#x34;&#x30;&#x25;&#x36;&#x35;&#x25;&#x37;&#x38;&#x25;&#x36;&#x31;&#x25;&#x36;&#x44;&#x25;&#x37;&#x30;&#x25;&#x36;&#x43;&#x25;&#x36;&#x35;&#x25;&#x32;&#x45;&#x25;&#x36;&#x33;&#x25;&#x36;&#x46;&#x25;&#x36;&#x44;">mail me</a>

但由于使用它们是合法的,每个浏览器/电子邮件客户端也应该处理这些编码。

答案 20 :(得分:1)

使用了这么多技术后,我找到了一种简单的方法,非常友好,机器人搜索@Símbolo,最近他们搜索[at] ant它的变化,所以我使用了2种技术

  1. 我在像domaintolls使用的图像上写我的电子邮件,它的工作原理 完美或
  2. 用像
  3. 的图像替换Símbolo(@)

    @ replace 并且图像alt将是alt =“@”因此机器人将找到一个图像,任何人都会将其视为正常地址,所以如果他复制它,他将复制电子邮件,工作就是 所以代码将是

    <p>myname<img src="http://www.traidnt.net/vb/images/mail2.gif" width="11" height="9" alt="@" />domain.com</p>
    

答案 21 :(得分:1)

我的功能。我已创建它,查看本主题中的答案。

 function antiboteEmail($email)
 {
        $html = '';

        $email = strrev($email);
        $randId = rand(1, 500);

        $html .= '<span id="addr-'.$randId.'" class="addr">[turn javascript on to see the e-mail]</span>';
        $html .= <<<EOD
                <script>
                $(document).ready(function(){

                    var addr = "$email";
                    addr = addr.split("").reverse().join("");
                    $("#addr-$randId").html("<a href=\"mailto:" + addr + "\">" + addr + " </a>");
                });
                </script>
EOD;

        return $html;
    }

它使用两种方法:从右到左dir和javascript put。

答案 22 :(得分:1)

选项1:将电子邮件地址拆分为多个部分,并在这些部分中使用JavaScript创建数组。 接下来以正确的顺序加入这些部分,并使用.innerHTML属性将电子邮件地址添加到网页。

 <span id="email">  </span>   // blank tag

 <script>
 var parts = ["info", "XXXXabc", "com", "&#46;", "&#64;"];
 var email = parts[0] + parts[4] + parts[1] + parts[3] + parts[2];
 document.getElementById("email").innerHTML=email; 
 </script>

选项2:使用图片而不是电子邮件文本

来自文字的图片创建者网站:http://www.chxo.com/labelgen/

选项3:我们可以使用AT而不是“@”和DOT而不是“。”

即:

 info(AT)XXXabc(DOT)com 

答案 23 :(得分:1)

我不喜欢混合使用JavaScript和HTML,这就是我使用此解决方案的原因。它现在对我来说很好。

想法:您可以通过在data - 属性中提供加密信息并在JS中对其进行解密来使其变得更加复杂。这可以通过替换字母或只是反转它们来完成。

HTML

<span class="generate-email" data-part1="john" data-part2="gmail" data-part3="com">placeholder</span>

<强> JS

$(function() {
    $('.generate-email').each(function() {
        var that = $(this);
        that.html(
            that.data('part1') + '@' + that.data('part2') + '.' + that.data('part3')
        );
    });  
});

试一试:http://jsfiddle.net/x6g9L817/

答案 24 :(得分:1)

首先,我要确保只有在启用了javascript时才显示电子邮件地址。这样,没有javascript就无法读取纯文本。

其次,实现安全功能的一种方法是远离<button>标记。此标记需要在标记之间插入文本,这使其具有计算机可读性。而是使用带有javascript处理程序的<input type="button">来查看onClick。 然后使用otherse提到的所有技术来实现安全的电子邮件表示法。

另一个选择是使用“点击查看电子邮件地址”按钮。点击后,这将变为已编码的电子邮件(HTML代码中的字符)。在另一次点击时,这会重定向到'mailto:email'功能

最后一个想法的未编码版本,带有可选择和不可选择的电子邮件地址:

<html>
<body>
<script type="text/javascript">
      e1="@domain";
      e2="me";
      e3=".extension";
email_link="mailto:"+e2+e1+e3;
</script>
<input type="text" onClick="this.onClick=window.open(email_link);" value="Click for mail"/>
<input type="text" onClick="this.value=email;" value="Click for mail-address"/>
<input type="button" onClick="this.onClick=window.open(email_link);" value="Click for mail"/>
<input type="button" onClick="this.value=email;" value="Click for mail-address"/>
</body></html>

看看这是否是你想要的东西,并将其与他人的想法结合起来。你永远不能太确定。

答案 25 :(得分:1)

如果我右键单击链接并选择“复制URL”,它是否有效?如果没有,这非常不理想(我很少点击mailto链接,更喜欢复制电子邮件地址并将其粘贴到我的邮件应用程序中,或者在特定时间点我需要的任何地方)。

我曾经相当偏执地保护我的邮件地址(UseNet,网络等),但是现在我怀疑更多“可能的垃圾邮件目标”实际上是通过编程方式生成的匹配本地部分到域。我的基础是,偶尔会通过我的邮件服务器日志。对于不存在的地址,往往会有相当多的传递尝试(包括在90年代后期,当地址刮擦非常普遍时,我在UseNet上悬挂的垃圾邮件诱饵的截断版本。)

答案 26 :(得分:1)

HTML_CHARACTER怎么样?:

joe&#064;mail.com

输出

joe@mail.com

答案 27 :(得分:1)

另一个选择,我是perefer字体真棒图标

Fa实施:

<link rel="stylesheet" href="path/to/font-awesome/css/font-awesome.min.css">

邮件地址:

<a href="mailto:info@uploadimage.club"><span class="label">info<i class="fa fa-at"></i>uploadimage.club</span></a>

答案 28 :(得分:1)

有一个开放式许可PHP脚本,可输出编码邮件的javascript:http://www.maurits.vdschee.nl/php_hide_email/。然后,您可以使用特定邮件作为参数轻松调用php函数。

答案 29 :(得分:0)

我只需提供另一个答案。我想出了一些有趣的东西。

我发现在许多常见的字符表中,字母@和a-z不止一次出现。您可以将原始字符映射到新映射,并使垃圾邮件机器人更难以确定电子邮件的内容。

如果你遍历字符串,并获得一个字母的字符代码,然后添加65248并根据该数字构建一个html实体,你会得到一个人类可读的电子邮件地址。

var str = 'john.doe@email.com';
str = str.toLowerCase().replace(/[\.@a-z]/gi, function(match, position, str){
    var num = str.charCodeAt(position);
    return ('&#' + (num + 65248) + ';');
});

这是一个工作小提琴:http://jsfiddle.net/EhtSC/8/

您可以通过在看起来相同的字符之间创建更完整的映射集来改进此方法。但是,例如,如果您将电子邮件复制/粘贴到记事本,则会收到很多信息。

为了克服一些用户体验问题,我创建了电子邮件作为链接。单击它时,它会将字符重新映射回原始字符。

为了改善这一点,您可以根据需要创建更复杂的字符映射。如果你能找到几个可以用来代替'a'的字符,为什么不随机映射到那些字符。

可能不是最安全的方法,但我真的玩得很开心:D

答案 30 :(得分:0)

以下是解决此问题的简单jquery解决方案:

<script type="text/javascript">
$(document).ready(function() {
    str1="mailto:";
    str2="info";
    str3="@test.com";
    $("#email_a").attr("href", str1+str2+str3);

});
</script>

<a href="#" id="email_a"><img src="sample.png"/></a>

答案 31 :(得分:0)

我最喜欢ofaurax的答案,但我会修改一下这个隐藏的电子邮件:

onclick="p1='admin'; p2='domain.com'; this.href='mailto:' + p1 + '& #x40;' + p2"

答案 32 :(得分:0)

这可能是互联网上最好,最简单的电子邮件保护程序。 非常简单但它能够添加所有的铃声和​​口哨声。

Protecting Email on webpages

使用JavaScript。 我已成功使用它多年了。

答案 33 :(得分:0)

一个巧妙的技巧是让div带有 Contact 一词,并且仅当用户将鼠标移到该电子邮件地址上时才显示该电子邮件地址。电子邮件可以使用Base64编码,以提供额外的保护。

方法如下:

<div id="contacts">Contacts</div>

<script>
  document.querySelector("#contacts").addEventListener("mouseover", (event) => {
    // Base64-encode your email and provide it as argument to atob()
    event.target.textContent = atob('aW5mb0BjbGV2ZXJpbmcuZWU=')
  });
</script>