繁体   English   中英

如何运行用户提供的Javascript没有安全问题(如jsFiddle,jsBin等)?

[英]How to run user-provided Javascript without security issues (like jsFiddle, jsBin, etc.)?

我需要运行一个完全由用户编写的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的其他文章( jsFiddle如何运行代码eval一般等等),但我仍然不确定如何正确地执行它。

首先: eval()的真正问题是什么? 攻击者可以做什么以及如何防止它(使用白名单,黑名单或用户输入清理库)? 任何人都可以深入解释jsFiddle和这样的网站如何执行用户输入?

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

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

幸运的是,有许多经过良好测试的项目由非常聪明的人创建,他们努力使运行第三方代码变得安全。 最着名的两个是Google Caja和Douglas Crockford的ADsafe

作为@Barmar指出,运行的jsfiddle在不同域的iframe的代码,这将导致浏览器不允许在iframe访问父页面的代码由于同源策略

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

对于Node.js:

  1. 创建子流程;

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

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

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

对于网络浏览器:

  1. 使用沙箱属性创建iframe(以使其内容服从跨源策略,因此无法访问主应用程序);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM