让电子邮件地址在网页上的机器人安全吗?

在网页上放置电子邮件地址时,请将它们放置为这样的文本:

joe.somebody@company.com 

或使用一个聪明的伎俩来欺骗电子邮件地址收割机机器人? 例如:

HTML转义字符:

 joe.somebody@company.com 

Javascript Decrypter:

 function XOR_Crypt(EmailAddress) { Result = new String(); for (var i = 0; i < EmailAddress.length; i++) { Result += String.fromCharCode(EmailAddress.charCodeAt(i) ^ 128); } document.write(Result); } XOR_Crypt("êïå®óïíåâïäùÀãïíðáîù®ãïí"); 

人类解码:

 joe.somebodyNOSPAM@company.com joe.somebody AT company.com 

你使用什么,或者你甚至打扰?

我一般不打扰。 我曾经是一个每天都有数千个垃圾邮件的邮件列表。 我们的垃圾邮件filter(spamassassin)可能让1或2天。 有了filter这个好,为什么合法的人难以联系你?

发明自己疯狂的电子邮件地址混淆scheme。 不pipe它是什么,只要它与任何一种通常所知的方法都不太相似。

问题是,真的没有一个好的解决scheme,它们都相对简单的绕过,或者让用户感到恼火。 如果任何一种方法变得普遍,那么有人find一个方法。

所以,而不是寻找一个真正的电子邮件地址混淆技术,拿出你自己的。 依靠这些机器人作者不关心你的网站足够的关于写一个东西来绕过你的略显疯狂的渲染文本与CSS和元素的边界或你完全离奇的,易于破解的JavaScriptencryption。 没关系,如果它是微不足道的,没有人会打扰试图绕过它,所以他们可以垃圾邮件。

我编写了一个编码器 ( 源代码 ),它使用了我能想到的各种parsing技巧(不同types的HTML实体,URL编码,注释,多行属性,软连字符,mailto:URL的非显而易见的结构等)

它不会阻止所有的收割机,但OTOH它完全符合标准,对用户透明。

另一个恕我直言的好方法(你可以使用除了棘手的编码)沿线:

 <a href="mailto:userhatestogetspam@example.com" onclick="this.href=this.href.replace(/hatestogetspam/,'')"> 

您可以使用reCAPTCHA保护您的电子邮件地址,他们提供免费服务,因此用户必须inputCAPTCHA(完全自动公开的Turingtesting,告诉计算机和人类除外)以查看您的电子邮件: https : //www.google.com/recaptcha /pipe理#mailhide

我不会打扰 – 这是在与错误的水平战斗的垃圾邮件战争。 特别是对于公司网站,我认为如果你在网页上有一个超链接的文本,那么它会让事情变得非常不专业。

有太多的垃圾邮件飞来飞去,无论如何你需要良好的过滤,任何机器人最终都会理解所有常见的技巧。

HTML:

 <a href="#" class="--mailto--john--domain--com-- other classes goes here" /> 

JavaScript,使用jQuery :

 // match all a-elements with "--mailto--" somehere in the class property $("a[class*='--mailto--']").each(function () { /* for each of those elements use a regular expression to pull out the data you need to construct a valid e-mail adress */ var validEmailAdress = this.className.match(); $(this).click(function () { window.location = validEmailAdress; }); }); 

我不打扰。 你只会烦扰复杂的用户,混淆不熟练的用户。 正如其他人所说,Gmail为个人/小型企业域提供了非常有效的垃圾邮件filter,企业filter通常也非常好。

唯一最安全的方法当然不是把电子邮件地址放在网页上。

改用联系表格。 把所有的电子邮件地址放到一个数据库中,然后创build一个HTML表单(主题,正文,来自…),用于提交用户在表单中填写的电子邮件内容(以及用于填写表单的ID或名称在数据库中查找该人的电子邮件地址)到服务器端脚本,然后将电子邮件发送给指定的人员。 电子邮件地址在任何时候都是暴露的。 你可能会想要实施某种forms的CAPTCHA来阻止垃圾邮件。

我的一个类似问题的答复是:

我使用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); }); 

这是一个工作的例子。

尝试电子邮件图标生成器。 http://services.nexodyne.com/email/

当然还有一些OCR机器人可能会得到这个..

我做我的任何DOC@whatever.com然后在我旁边写“删除大写字母”

免费的Gmail有一个很棒的垃圾邮件filter。

如果您不想直接使用Gmail,则可以将电子邮件发送到gmail,并使用gmail转发function在垃圾邮件filter发送后发送给您。

在更复杂的情况下,当您需要显示@ business.com地址时,您可以显示public@business.com,并将所有这些邮件转发给gmail帐户,然后将其转发回real@business.com

我想这不是你的问题的直接解决scheme,但它可能会有所帮助。 Gmail是免费的,有这样一个很好的垃圾邮件filter使用它是一个非常明智的select恕我直言。

我每天在我的gmail帐户中收到大约100封垃圾邮件,但我不记得上次有人收到我的收件箱。

总结一下,不pipe是Gmail还是其他的,都要使用一个好的垃圾邮件filter 让用户重新input或修改显示的电子邮件地址就像使用DRM来防止盗版一样。 把“好人”的负担放在一边,不应该成为做任何事的途径。 🙂

对于你自己的电子邮件地址,我build议不要担心太多。 如果您需要将您的电子邮件地址提供给成千上万的用户,那么我会build议使用Gmail地址(香草或通过谷歌应用程序)或使用高品质的垃圾邮件filter。

但是,当在您的网站上显示其他用户的电子邮件地址时,我认为需要一定程度的尽职调查。 幸运的是,一位名叫西尔万·穆勒曼(SilvanMühlemann)的博客为你做了所有艰难的工作 。 他在1.5年的时间里testing了不同的混淆方法,并确定了最好的方法,其中大部分都涉及到CSS或者JavaScript技巧,这些技巧使地址能够在浏览器中正确呈现,但会让自动化的刮板产生混淆。

另一种可能是唯一的技术可能是使用多个图像和一些纯文本字母来显示地址。 这可能会混淆机器人。

将电子邮件地址保存为png文件的脚本将是一个安全的解决scheme(如果您有足够的空间并允许将图像embedded到您的页面中)

这就是我们使用的(VB.NET):

 Dim rxEmailLink As New Regex("<a\b[^>]*mailto:\b[^>]*>(.*?)</a>") Dim m As Match = rxEmailLink.Match(Html) While m.Success Dim strEntireLinkOrig As String = m.Value Dim strEntireLink As String = strEntireLinkOrig strEntireLink = strEntireLink.Replace("'", """") ' replace any single quotes with double quotes to make sure the javascript is well formed Dim rxLink As New Regex("(<a\b[^>]*mailto:)([\w.\-_^@]*@[\w.\-_^@]*)(\b[^>]*?)>(.*?)</a>") Dim rxLinkMatch As Match = rxLink.Match(strEntireLink) Dim strReplace As String = String.Format("<script language=""JavaScript"">document.write('{0}{1}{2}>{3}</a>');</script>", _ RandomlyChopStringJS(rxLinkMatch.Groups(1).ToString), _ ConvertToAsciiHex(rxLinkMatch.Groups(2).ToString), _ rxLinkMatch.Groups(3), _ ConvertToHtmlEntites(rxLinkMatch.Groups(4).ToString)) Result = Result.Replace(strEntireLinkOrig, strReplace) m = m.NextMatch() End While 

  Public Function RandomlyChopStringJS(ByVal s As String) As String Dim intChop As Integer = Int(6 * Rnd()) + 1 Dim intCount As Integer = 0 RandomlyChopStringJS = "" If Not s Is Nothing AndAlso Len(s) > 0 Then For Each c As Char In s.ToCharArray() If intCount = intChop Then RandomlyChopStringJS &= "'+'" intChop = Int(6 * Rnd()) + 1 intCount = 0 End If RandomlyChopStringJS &= c intCount += 1 Next End If End Function 

我们重写Render,并在出门之前通过这个来运行传出的HTML。 这会呈现通常呈现给浏览器的电子邮件地址,但在源代码中看起来像这样:

 <script language="JavaScript">document.write('<a '+'clas'+'s='+'"Mail'+'Link'+'" hr'+'ef'+'="ma'+'ilto:%69%6E%66%6F%40%62%69%63%75%73%61%2E%6F%72%67">&#105;&#110;&#102;&#111;&#64;&#98;&#105;&#99;&#117;&#115;&#97;&#46;&#111;&#114;&#103;</a>');</script> 

显然不是万无一失的,但希望可以减less一定数量的收获,而不会让访客难堪。

这取决于你的需求是什么。 对于我工作的大多数网站,我发现将“联系我/我们”表格发送给系统中的任何人需要联系的人是非常有用的。 我知道,这不是你正在寻找的解决scheme,但它完全防止收获,到目前为止,我从来没有看到垃圾邮件通过这样的forms发送。 它会发生,但这是非常罕见的,你从来没有收获。

这也使您有机会在发送消息之前logging消息,如果您愿意的话,还可以为您提供额外的保护,防止失去联系。

随着时间的推移,垃圾邮件机器人将拥有自己的Javascript和CSS引擎,所以我认为你不应该看这个方向。

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

我只是编码以下。 不知道它是否好,但是用纯文本写电子邮件会更好。 许多机器人将被愚弄,但不是全部。

 <script type="text/javascript"> $(function () { setTimeout(function () { var m = ['com', '.', 'domain', '@', 'info', ':', 'mailto'].reverse().join(''); /* Set the contact email url for each "contact us" links.*/ $('.contactUsLink').prop("href", m); }, 200); }); </script> 

如果机器人解决这个问题,那么就不需要像“if(1 == 1?'@':'')”那样添加更多的“简单逻辑”代码,或者以另一种顺序添加数组元素,因为机器人只是代码。

字体真棒作品!

 <link rel="stylesheet" href="path/to/font-awesome/css/font-awesome.min.css"> <p>myemail<i class="fa fa-at" aria-hidden="true"></i>mydomain.com</p> 

http://fontawesome.io/