JavaScript电子邮件混淆有多安全?

7
为了在我的网站上放置电子邮件地址,我使用这个Javascript代码:
function showEmailLink(user, domain, linkText) {
 if (linkText == "") {
  linkText = user + "@" + domain;
 }
 return document.write("<a href=" + "mail" + "to:" + user + "@" + domain
   + ">" + linkText + "<\/a>");
}

这样在我的HTML中我就可以写出这样的内容:

please send me an 
<script type="text/javascript">
  <!--
  showEmailLink("edward","tanguay.info","e-mail");
  //-->
</script>

这可以保护我的网站免受垃圾邮件发送者的侵扰,他们通过从源代码中屏幕截取电子邮件地址来收集地址,因为我的电子邮件地址在文本中是不存在的

然而,我无法想象一个有动力的垃圾邮件发送者无法编写某种屏幕截取工具,该工具可以自动地根据这个JavaScript和HTML代码确定电子邮件地址。

这种JavaScript电子邮件混淆方法真的有多安全呢?

7个回答

14

这并不是“安全”问题——任何普通用户可以看到的内容都不是“安全”的,因为真正决定要破坏的恶意实体可以像普通用户一样行事并渲染/评估页面。

这更多是一个威慑问题——自动收割者有多在意?我没有确切的数据,但我的猜测是,大多数收割者不会费力去完全渲染或评估页面,因为对于他们来说,还有很多“软目标”,而完全评估页面的脚本需要较长时间,不适合快速大规模爬取。

如果你真的想要威慑收割者,目前可能最好的威慑方式是使用类似Mailhide的CAPTCHA来检索地址。然而,即使如此,如果收割者足够决心,也可以通过知道或甚至无意中众包破解CAPTCHA等方法来破坏它。


1
如果有人想特别针对您的网站,那么这个方法是0%安全的。如果您只是想提高防范自动脚本的能力,那么这个方法可能还可以。我没有跟上技术发展的最新状态。
不过,我要指出的是,您不应该通过document.write()注入任意字符串(例如用户名和域名)到您的HTML中,因为那是一个安全漏洞。您应该创建一个A节点并使用getter/setter方法。

1
安全漏洞在哪里?我猜我可能漏看了什么,但我唯一能看到的影响就是用户可以修改他们本地计算机上的HTML。 - nfm

1

如果你要这么做(我原则上不同意,因为我认为所有内容都应该对用户无障碍可见),那么诀窍就是做些独特的事情。如果你的方法是独特的,爬虫作者编写绕过代码的意义就不大了,对吧?

然而,一些现代化的爬虫已知会使用渲染源来扫描地址,使任何JavaScript混淆方法都毫无意义。


1
reCAPTCHA(以及由它完成的Mailhide)的一个优点是它也提供了非Javascript版本。 - Amber

1

这完全取决于渲染页面的成本是否能够抵消电子邮件地址的价值。正如Dav所说,专业垃圾邮件发送者可以雇佣一支廉价劳动力团队来渲染此类页面或解密CAPTCHA。在某些情况下,这是非常有价值的,例如在受信任的域名上创建新的电子邮件帐户。

您可以通过在showEmailLink()中执行一些计算来增加渲染页面的成本。


1

虽然我没有任何确凿的证据,但我相信电子邮件收割机已经有能力执行JavaScript代码了几年了。这仅基于使用与您类似的函数来“保护”公共页面上未在其他任何地方使用的电子邮件地址。果然,最终他们开始收到垃圾邮件。

从根本上讲,任何不需要人类解释和输入电子邮件地址的操作,最终都会被电子邮件收割机获取。如果您的浏览器可以执行JavaScript进行解码,那么他们也可以(他们可能使用浏览器来执行)。


1

matt cutts在网站管理员视频中提到,这种技术不再“安全”,请参见此链接http://www.youtube.com/watch?v=Ce6cLrrfS5E。他说,如果您将JavaScript放置在机器人.txt禁止的位置,则无需担心机器人呈现HTML,但Google正在改进解析JavaScript,并且如果您使用此方法,则您的地址可能以明文可搜索的方式出现。


0
如果你和我一样不介意使用JavaScript,我发现了这个页面:http://reliableanswers.com/js/mailme.asp 它基本上使用了这段代码片段:
<script type="text/javascript">
function mailMe(sDom, sUser)
{
  return("mail"+"to:"+sUser+"@"+sDom.replace(/%23/g,"."));
}
</script>
<a href="/contact/" title="Contact Me!"
 onmouseover="javascript:this.href=mailMe('example%23com','me');"
 onfocus="javascript:this.href=mailMe('example%23com','me');">Contact
Me!</a>

非常不错的混淆。


它的采纳率很低,这使它不好。如果你找到了它,收割者也会找到。 :) - bzlm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接