【问题标题】:How to run user-provided Javascript without security issues (like jsFiddle, jsBin, etc.)?如何在没有安全问题的情况下运行用户提供的 Javascript(如 jsFiddle、jsBin 等)?
【发布时间】:2014-10-25 10:45:19
【问题描述】:

我需要运行一个完全由用户编写的 Javascript 函数。我给他提供了一个骨架,但细节由他指定,例如

function main(model, console) {
    // the user can enter anything here
    // ideally, he would only be allowed to 
    // use the methods that "model" and "console" provide, e.g.
    var item = model.getItems();
    console.log("Found " + item.length + " items.");
}

为了使应用程序正常工作,用户只需要访问参数的方法和属性(他明确地不需要文档或窗口访问或发送XMLHttpRequests)。

我已经阅读了几篇关于eval() 函数以及如何使用它来运行代码的文章。我还阅读了有关 StackOverflow 的其他文章(how jsFiddle runs codeeval in general 等),但我仍然不确定如何正确执行。

首先:eval()的真正问题是什么?攻击者可以做什么以及如何防止它(使用白名单、黑名单或用户输入清理库)? 谁能深入解释一下 jsFiddle 和此类网站如何执行用户输入?

【问题讨论】:

  • 恶意用户可以使用eval 获取您应用程序的 cookie(如用户会话令牌,这将允许他们模拟登录用户)、客户端内存中保存的任何状态并生成请求从您的服务器获取更多状态。它可以将任何数据发布到另一台服务器。简而言之,他们可以拥有您的应用程序。
  • jsfiddle 将用户的文档放在一个 IFRAME 中,并在不同的域中运行它(fiddle.jshell.net 而不是jsfiddle.net),因此它无法访问 jsfiddle 应用程序。
  • 你能详细解释一下吗?他们如何沟通?这种方法有什么局限性?

标签: javascript security eval jsfiddle


【解决方案1】:

evaled 代码可以做什么?它基本上可以做任何你的代码可以做的事情;它在相同的上下文中进行评估。

创建一个允许第三方代码运行同时保护自己的系统非常困难,并且充满了自取其辱的机会。尝试制定自己的解决方案是一个非常糟糕的主意。

幸运的是,有许多由非常聪明的人创建的经过良好测试的项目,它们努力确保运行第三方代码的安全性。最突出的两个是 Google Caja 和 Douglas Crockford 的 ADsafe

正如@Barmar 所说,JSFiddle 在不同域的 iframe 中运行代码,这会导致浏览器由于 Same Origin Policy 而不允许 iframe 中的代码访问父页面。

【讨论】:

    【解决方案2】:

    运行不受信任的 JavaScript 的正确方法是将其放入沙盒环境中。以下是我为上述目的而编写的Jailed library 所使用的技术:

    对于 Node.js:

    1. 创建子流程;

    2. 将代码加载为字符串(读取文件内容,以防有路径);

    3. 在代码开头添加use strict;(为了防止使用arguments.callee.caller破坏沙箱);

    4. 使用vm.runInNewContext() 在单独的上下文中评估该字符串,其中提供的sandbox 仅公开一些基本方法,例如setTimeout()

    对于网络浏览器:

    1. 创建一个带有sandbox attribute的iframe(使其内容遵守跨域策略,因此无法访问主应用程序);

    2. 在该 iframe 中创建一个 web-worker(这样用户提交的代码将拥有自己的线程,因此不会冻结 UI)

    【讨论】:

      猜你喜欢
      • 2014-06-25
      • 2019-10-01
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 2021-06-09
      相关资源
      最近更新 更多