这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将如何用作反垃圾邮件。有人可以告诉我为什么在这种特殊情况下使用它?
答案 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;。
之所以这样,是几周/几个月前谷歌推出的新保护措施。 让我告诉你新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()
是危险的。在硬编码字符串上使用时,通常情况并非如此。