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

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

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

你怎么看待这件事? 它有效吗? 你知道或使用什么其他方法?

这是我使用的方法,带有服务器端包含,例如<!--#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收到电子邮件,垃圾邮件几乎不成问题。 所以,我不能说这个方法有多有效。 你可能想读这个研究 (虽然它是旧的),产生这个图:

在这里输入图像描述

看看这样 ,很聪明,使用CSS。

CSS

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

HTML

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

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

希望它有帮助

干杯

我有一个完全不同的承担这一点。 我为此使用MailHide

MailHide是Google的系统,用户需要完成reCAPTCHAtesting,然后向他们发送电子邮件。

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

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

添加尽可能多的X的只要你喜欢。 它完美的阅读,复制和粘贴,并不能被机器人读取。

在CSS中使用content和attr:

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

我认为唯一的万无一失的方法是创build一个联系人页面,该页面是提交给发送到您的电子邮件地址的脚本的表单。 这样,你的地址就永远不会暴露给公众。 由于某些原因,这可能是不可取的,但我认为这是一个很好的解决scheme。 当我不得不把他人的电子邮件地址从他们的网站复制/粘贴到我的邮件客户端并给他们发送信息时,经常会感到厌烦; 我宁愿通过他们的网站上的一个表单。 此外,这种方法可以让你有匿名的意见发送给你等。只要确保使用某种反机器人计划,如validation码保护您的表单。 在这里讨论的有很多。

请参阅使网站上的电子邮件地址安全吗?

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

我以前也用过Enkoder–以为老实说很好!

如果你有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); ?> 

我知道我的答案不会被很多人所喜欢,但请在大拇指向下考虑这里列出的要点。

任何容易被机器读取的东西都会被垃圾邮件发送者轻松读取。 即使他们的行为对我们来说似乎是愚蠢的,他们也不是愚蠢的人。 他们是创新和足智多谋的。 他们不仅仅使用机器人来收取电子邮件,他们还可以使用过多的方法,除此之外,他们只需支付新的电子邮件清单。 这意味着,他们有全球数千名黑帽黑客执行他们的工作。 人们准备好编写恶意软件来刮擦别人浏览器的屏幕,这些恶意软件最终会使你试图实现的任何方法变得毫无用处。 这个线程已经被10多个这样的人阅读,他们在嘲笑我们。 他们中的一些人甚至可能无聊地stream泪,发现我们不能对他们提出新的挑战。

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

不仅你和那些收到电子邮件的人认为时间是资产。 因此,你必须find一种方法来混淆电子邮件地址的方式,它不会付出破解。 如果您使用一些广泛使用的方法来混淆电子邮件,它确实有利于破解它。 因此,如果不是数十万甚至数十万封新鲜的电子邮件,这个黑客就会得到数以千计的手。 对他们来说,他们会得到钱。

所以,继续编写你自己的方法。 这是一个罕见的情况下,重新发明轮子真的回报。 使用一种不是机器可读的方法,并且优选地需要一些用户交互而不牺牲用户体验的方法。

我花了大约20分钟来代表我的意思。 在这个例子中,我使用了KnockoutJS,因为我喜欢它,而且我知道你不会自己使用它。 但无论如何,这是无关紧要的。 这是一个不被广泛使用的定制解决scheme。 破解它不会造成奖励,因为这样做的方法只能在大型互联网上的单个页面上工作。

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

下面的代码并不是一个好代码的例子。 但只是一个很难find机器的代码,我们甚至在这里处理电子邮件。 即使可以做到,也不会大规模执行。

是的,我知道它不能在IE = lte8上工作,因为'无法获取属性'未定义或空引用',但我根本不在乎,因为它只是一个方法的演示,而不是实际的实现,而不是打算用于生产。 随意编写你自己的更酷,技术上更坚实等。

哦,并永远不会用html或javascript命名邮件或电子邮件。 只需要简单的方法就可以将DOM和窗口对象用于任何名为mail或email的东西,并检查它是否包含与电子邮件相匹配的东西。 这就是为什么你不希望任何variables将包含完整forms的电子邮件,这也是为什么你希望用户在分配这些variables之前与页面进行交互的原因。 如果您的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); 

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

另一个解决scheme是使用JavaScript来组装地址的一部分,并对地址进行即时解码。 缺点是JavaScript禁用的浏览器不会显示您的地址。

最有效的解决scheme是使用图像 ,但用户需要手动复制地址是一件痛苦的事情。

你的解决scheme是相当不错的 ,因为你只为禁用了javascript的用户添加了一个缺点(手动编写@)。 您也可以通过以下方式更安全:

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

我最喜欢的方法之一是使用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> 

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

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

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

这是一个工作的例子。

! – 添加这个参考,不知道过时的信息可能是,但它告诉了一些简单的解决scheme,不需要使用任何脚本

自己search这个后,我遇到了这个页面,但也是这些网页:

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 

把它与前面提到的任何方法结合起来,甚至可以使它更有效

一个简单的解决scheme是使用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> 

隐藏电子邮件地址的最佳方法只有在程序员发现这个“编码”并实现一个解密algorithm之后才是好的。

JavaScript选项不会工作太久,因为有很多爬虫解释JavaScript。

没有答案,恕我直言。

有可能是机器人将@和其他伪装认作@符号。 所以这不是一个真正有效的方法。

当然,你可以使用一些编码,如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> 

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

我是SpamSpan的粉丝 – 它被混淆了,但是如果JS被禁用,它仍然可以被破译。 这似乎也工作,虽然我只在一个低stream量的网站上使用了大约一年。

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

这是我的工作版本:


使用后备文本创build某个容器:

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

并添加在DOM的底部(关于渲染)下面的代码片段:

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

另外这里是一个缩小版本:

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

如果我右键单击链接并select“复制URL”,是否工作? 如果没有,这是非常不理想的情况(我很less点击邮件链接,喜欢复制电子邮件地址并粘贴到我的邮件应用程序或任何我需要它在特定的时间点)。

我曾经是相当偏执的保护我的邮件地址在线(UseNet,networking之类),但是现在我怀疑更多的“可能的垃圾邮件目标”实际上是以编程方式生成匹配本地部分的域名。 我基于此,有时,通过我的邮件服务器日志。 对于不存在的地址,往往会有很多交付尝试(包括垃圾邮件的截尾版本,在90年代末期,当地址抓取非常stream行时,我曾在UseNet上悬挂过)。

使用这么多的技术后,我发现一个简单的方法,非常友好,机器人search@Símbolo和最近他们search[ant]它的变化,所以我使用2种技术

  1. 我写了我的电子邮件像domaintolls使用的图像,它可以完美或
  2. 用它的图像replaceSímbolo(@)

@替换 和图像alt将alt =“@”所以机器人会find一个图像,任何人会看到它作为一个正常的地址,所以如果他复制它,他会复制电子邮件和工作是这样的代码将

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

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

首先,我会确保电子邮件地址只显示当您启用JavaScript。 这样,没有纯文本,可以阅读没有JavaScript。

其次,实现安全function的一种方法是远离<button>标签。 这个标签需要在标签之间插入文本,这使得它可以被计算机读取。 而是尝试使用onClick的JavaScript处理程序来处理<input type="button"> 。 然后使用他人提到的所有技术来实现一个安全的电子邮件符号。

另一个select是有一个button“点击看emailaddress”。 一旦点击,这将变成一个编码的电子邮件(HTML代码中的字符)。 在另一次点击这个redirect到“mailto:email”function

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

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

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

和我的function。 我已经创build了它看这个主题的答案。

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

它使用两种方法:从左到右的方向和JavaScript的放置。

选项1:将电子邮件地址拆分为多个部分,并使用JavaScript在这些部分中创build一个数组。 接下来以正确的顺序连接这些部分,并使用.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 

我不喜欢JavaScript和HTML混合,这就是为什么我使用这个解决scheme。 现在对我来说工作得很好。

想法 :通过在data属性中提供encryption的信息并在JS中对其进行解密,可以使其变得更加复杂。 这只是通过replace字母或只是颠倒它们而完成的。

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/

这可能是互联网上最好最简单的电子邮件保护器。 非常简单,但它有能力添加所有的花里胡哨。

保护网页上的电子邮件

使用JavaScript。 多年来我一直在使用它。

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

首先,定义CSS:

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

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

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

和田!

这是一个简单的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> 

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

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

我只需要提供另一个答案。 我只是想出了一些有趣的玩法。

我发现,在许多常见的字符表中,字母@和az再次出现。 您可以将原始字符映射到新映射,并使垃圾邮件机器人难以弄清楚电子邮件是什么。

如果你通过string循环,并获得一个字母的字符代码,然后添加65248,并build立一个基于数字的HTML实体,你拿出一个人类可读的电子邮件地址。

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

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

您可以通过在看起来相同的字符之间创build更完整的一组映射来改进此方法。 But if you copy/paste the e-mail to notepad, for example, you get a lot of boxes.

To overcome some of the user experience issues, I created the e-mail as link. When you click it, it remaps the characters back to their originals.

To improve this, you can create more complex character mappings if you like. If you can find several characters that can be used for example in the place of 'a' why not randomly mapping to those.

Probably not the most secure approach ever but I really had fun playing around with it 😀