为什么gmail使用eval?

时间:2014-02-13 18:05:04

标签: javascript gwt eval

question表明使用eval是一种不好的做法,许多其他问题表明它是“邪恶的”。

该问题的答案表明,使用eval()可能有助于其中一种情况:

  
      
  • 评估从远程服务器收到的代码。 (假设您想通过向其发送JavaScript代码来创建可以远程控制的站点?)
  •   
  • 评估用户编写的代码。如果没有eval,你就无法编程   例如,在线编辑/ REPL。
  •   
  • 动态创建任意长度的函数(function.length   是readonly,所以唯一的方法是使用eval)。
  •   
  • 加载脚本并返回其值。如果您的脚本是,为   例如,一个自我调用函数,你想要评估它并获得   它的结果(例如:my_result = get_script_result(“foo.js”)),唯一的   编写函数get_script_result的方法是使用eval   在里面。
  •   
  • 在不同的闭包中重新创建一个函数。
  •   

在查看Google Accounts page源代码时,我发现了这个:

(function(){eval('var f,g=this,k=void 0,p=Date.now||function(){return+new Date},q=function(a,b,c,d,e){c=a.split("."),d=g,c[0]in d||!d.execScript||d.execScript("var "+c[0]);for(;c.length&&(e=c.shift());) [a lot of code...] q("botguard.bg.prototype.invoke",K.prototype.ha);')})()</script>

我无法理解它是如何有用的,因为它与上述任何情况都不匹配。有评论说:

 /* Anti-spam. Want to say hello? Contact (base64)Ym90Z3VhcmQtY29udGFjdEBnb29nbGUuY29tCg== */

我看不出eval将如何用作反垃圾邮件。有人可以告诉我为什么在这种特殊情况下使用它?

2 个答案:

答案 0 :(得分:20)

来自plan99.net的Mike Hearn创建了反机器人JS系统,你可以看到它的部分反逆向工程方法(随机加密)。他的信中提到了它:https://moderncrypto.org/mail-archive/messaging/2014/000780.html

  

[messaging]现代反垃圾邮件和E2E加密   迈克赫恩   Fri Sep 5 08:07:30 PDT 2014

     

防止批量注册涉及大量魔法。   例如,我创建了一个随机生成加密的系统   旨在抵制逆向工程尝试的JavaScripts。这些   程序知道如何检测自动注册脚本并完全擦除   他们出去了   http://webcache.googleusercontent.com/search?q=cache:v6Iza2JzJCwJ:www.hackforums.net/archive/index.php/thread-2198360.html+&cd=8&hl=en&ct=clnk&gl=ch

您可以通过其&#34; Ym90Z3VhcmQtY29udGFjdEBnb29nbGUuY29tCg&#34;来谷歌查询有关系统的信息。 base64联系人代码或&#34; botguard-contact&#34;。

帖子http://webcache.googleusercontent.com/search?q=cache:v6Iza2JzJCwJ:www.hackforums.net/archive/index.php/thread-2198360.html+&cd=8&hl=en&ct=clnk&gl=ch说:

  

之所以这样,是几周/几个月前谷歌推出的新保护措施。   让我告诉你新Botguard的一部分(谷歌称之为)   代码:

/* Anti-spam. Want to say hello? Contact (base64) Ym90Z3VhcmQtY29udGFjdEBnb29nbGUuY29tCg== */
     

您必须破解此JavaScript的算法,才能创建允许您注册新帐户的VALID令牌。   谷歌仍然允许你创建没有这些令牌的帐户,你想知道为什么吗?

     

因为他们等了几个星期,跟踪你和你的愚蠢机器人留下的痕迹,而不是制造禁令。

     

您销售的所有帐户,客户创建的所有帐户都将被禁止。   在banwave之后,您的软件可能仍然可以创建帐户,但是有什么用?

因此,botguard是可选的安全措施。它可以在浏览器中正确计算,但不能在机器人使用的某些/大多数javascript引擎中计算。您可以通过不输入正确的代码来绕过它,但创建的帐户将被标记为僵尸帐户,并且很快就会被禁用(链接的帐户也将被终止)。

GitHub上还有几个史诗主题:

https://github.com/assaf/zombie/issues/336

  

与以下示例中更基本的上下文版本相比,为什么Zombie会产生不正确的输出?

     

输出取决于document.bg何时初始化为新的botguard.bg(),因为botguard脚本在编码时混合了时间戳盐。

     

mikehearn于2012年5月21日发表评论   你好,

     

我在Google上为注册和登录安全工作。

     

请勿尝试自动化Google注册表单。这不是一个好主意,你正在分析一个专门阻止你的系统。

     

没有合法的用例来自动化此表单。如果您这样做并且我们检测到您,则您使用它创建的帐户将立即终止。与您使用的IP相关联的帐户(即您的个人帐户)也可能被终止。

     

如果您认为自己拥有合法用例,那么最好不要探索其他选择。

https://github.com/jonatkins/ingress-intel-total-conversion/issues/864主题中有一些细节:

  

a包含以此评论开头的严重混淆代码:

     

代码包含许多通用内容:useragent嗅探(yay,Internet Explorer),对象类型检测,用于监听鼠标/ kb事件的代码......所以它看起来像是一些通用库。在那之后,有很多神秘的东西完全没有意义。有趣的是,它调用标记为&#34; botguard.bg.prototype.invoke&#34;的东西。   显然这必须是谷歌的僵尸。据我所知,它收集有关页面及其浏览器上的用户行为的数据,并将其与其他已知数据相对应,这样它可以检测异常使用并检测机器人(有点像入口客户端中的clienBlob)。我的猜测是,它会检测用户发送请求所需采取的操作(点击,地图事件将是最明智的)

所以,google使用邪恶的eval来对抗恶意用户,这些用户无法快速/正确地模拟评估的代码。

答案 1 :(得分:3)

在不受信任的输入上使用

eval()是危险的。在硬编码字符串上使用时,通常情况并非如此。