通过网页上的漫游器确保电子邮件地址安全?
将电子邮件地址放置在网页上时,我们将其放置为如下所示的文本:
[email protected]
还是使用巧妙的技巧来欺骗电子邮件地址收集器机器人?例如:
HTML转义字符:
joe.somebody@company.com
Javascript解密器:
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("ê???ó?í?a??ùà??íeá?ù???í");
人工解码:
[email protected] joe.somebody AT company.com
我们使用什么,甚至会打扰?
解决方案
我一般不会打扰。我曾经在邮件列表中,每天收到数千封垃圾邮件。我们的垃圾邮件过滤器(spamassassin)每天可能发送1或者2个邮件。使用过滤器这么好,为什么合法人很难与我们联系?
我不会打扰-它在错误的水平上打击垃圾邮件战争。特别是对于公司网站,如果我们除了页面上带有mailto超链接的纯文本之外,还有其他事情,我认为这会使事情看起来非常专业。
到处都是垃圾邮件,我们无论如何都需要良好的过滤,而且任何漫游器最终都将了解所有常见的技巧。
尝试使用电子邮件图标生成器。
http://services.nexodyne.com/email/
当然,仍然有一些OCR机器人可以实现这一目标。
我们可以使用reCAPTCHA保护电子邮件地址,因为它们提供免费服务,因此人们必须输入CAPTCHA(完全自动化的公共图灵测试以告诉计算机和人类分开)才能查看电子邮件:https://www.google.com/recaptcha / admin#mailhide
发明自己的疯狂电子邮件地址混淆方案。没关系,实际上,只要它与任何众所周知的方法不太相似即可。
问题在于,实际上并没有很好的解决方案,它们或者相对较容易被绕开,或者会给用户带来不便。如果任何一种方法盛行,那么有人会找到解决方法。
因此,与其寻找一种"真实的"电子邮件地址混淆技术,不如自己想出办法。依靠这样一个事实,即这些bot作者对网站不太在乎,只能坐在周围写东西来绕过我们有点疯狂的CSS和元素边界渲染文本,或者我们完全陌生,容易破解的javascript加密。琐事无关紧要,没有人会去尝试绕过它,以便向我们发送垃圾邮件。
我将我的文件命名为[email protected],然后在其旁边写下"删除大写字母"
唯一最安全的方法当然是不要首先将电子邮件地址放在网页上。
另一种可能独特的技术可能是使用多个图像和一些纯文本字母来显示地址。这可能会混淆机器人。
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; }); });
将电子邮件地址保存为png文件的脚本是一种安全的解决方案(如果我们有足够的空间并且可以在页面中嵌入图片)
这是我们使用的(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">info@bicusa.org</a>');</script>
显然不是万无一失的,但是希望减少一定数量的收获而不会给游客带来麻烦。
请改用联系表格。将我们所有的电子邮件地址放入数据库中,并创建一个HTML表单(主题,正文,...),以提交用户在表单中填写的电子邮件内容(以及用于在服务器端脚本中查找该人的电子邮件地址),然后将其发送给指定的人。电子邮件地址绝不会暴露。我们可能还想实现某种形式的验证码,以阻止垃圾邮件发送器。
这取决于确切需求。对于大多数与我合作的网站,我发现以"与我/我们联系"的形式填写表格更为有用,该表格将系统中的电子邮件发送给需要联系的人。我知道这并不是我们要寻找的解决方案,但是它确实可以防止收割,到目前为止,我还从未见过通过这种形式发送垃圾邮件的情况。它会发生,但是非常罕见,我们永远也不会收获。
如果我们愿意,这还使我们有机会在发送消息之前记录消息,从而为我们提供了额外的保护级别,以防止失去联系。
免费的Gmail具有出色的垃圾邮件过滤器。
如果我们不想直接使用Gmail,则可以将电子邮件发送到gmail,并在通过垃圾邮件过滤器后使用gmail转发将其发送回给我们。
在更复杂的情况下,当我们需要显示@ business.com地址时,我们可以显示[email protected]并将所有邮件转发到gmail帐户,然后将其转发回[email protected]
我想这不是我们问题的直接解决方案,但可能会有所帮助。
Gmail是免费的,并且具有如此出色的垃圾邮件过滤器,这使它成为恕我直言的明智之选。
我的gmail帐户每天大约收到100封垃圾邮件,但我不记得其中一个上次进入我的收件箱。
总结一下,无论Gmail还是其他,都使用一个好的垃圾邮件过滤器。让用户重新输入或者修改显示的电子邮件地址就像使用DRM防止盗版一样。把负担放在"好人"身上不应该成为做任何事情的方法。 :)
我不打扰我们只会惹恼老练的用户,并使老练的用户感到困惑。正如其他人所说,Gmail为个人/小型企业域提供了非常有效的垃圾邮件过滤器,而公司过滤器通常也非常好。
我编写了一个编码器(源代码),该编码器使用了我可能想到的各种解析技巧(不同种类的HTML实体,URL编码,注释,多行属性,软连字符,mailto的非显而易见结构:URL等)
它并不能阻止所有收割机,但是OTOH完全符合标准且对用户透明。
另一种IMHO好的方法(除了棘手的编码之外,还可以使用)是:
<a href="mailto:[email protected]" onclick="this.href=this.href.replace(/hatestogetspam/,'')">
对于我们自己的电子邮件地址,建议不要过分担心。如果我们需要让成千上万的用户使用电子邮件地址,那么我建议我们使用Gmail地址(香草或者通过Google Apps)或者使用高质量的垃圾邮件过滤器。
但是,在网站上显示其他用户的电子邮件地址时,我认为需要进行一定程度的尽职调查。幸运的是,一个名叫Silvan Mhlemann的博客为我们完成了所有艰巨的工作。他在1.5年的时间里测试了不同的混淆方法,并确定了最佳方法,其中大多数涉及css或者javascript技巧,这些技巧可以在浏览器中正确显示地址,但会混淆自动抓取工具。
随着时间的推移,垃圾邮件机器人将拥有自己的Javascript和CSS引擎,因此我认为我们不应该朝这个方向发展。