WeS*_*eSt 6 javascript security eval jsfiddle
我需要运行一个完全由用户编写的 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.");
}
Run Code Online (Sandbox Code Playgroud)
为了使应用程序正常工作,用户只需要访问参数的方法和属性(他明确不需要文档或窗口访问或发送XMLHttpRequests)。
我已经阅读了几篇有关eval()函数以及如何使用它来运行代码的文章。我还阅读了 StackOverflow 上的其他文章(jsFiddle 如何运行代码、一般情况下的 eval等),但我仍然不确定如何正确执行。
首先:什么是真正的问题eval()?攻击者可以做什么以及如何防止攻击(使用白名单、黑名单或用户输入清理库)?谁能深入解释 jsFiddle 和此类网站如何执行用户输入?
运行不受信任的 JavaScript 的正确方法是将其放入沙盒环境中。这是我自己为上述目的而编写的Jailed 库所使用的技术:
对于 Node.js:
创建子流程;
将代码作为字符串加载(如果有路径,则读取文件内容);
use strict;在代码开头添加(为了防止使用破坏沙箱arguments.callee.caller);
使用 在单独的上下文中评估该字符串vm.runInNewContext(),其中提供的sandbox仅公开一些基本方法,例如setTimeout().
对于网络浏览器:
创建一个具有沙箱属性的iframe (使其内容遵守跨域策略,因此无法访问主应用);
在该 iframe 内创建一个 web-worker(以便用户提交的代码将获得自己的线程,因此不会冻结 UI)
evaled代码能做什么?它基本上可以做你的代码可以做的任何事情;它是在相同的上下文中进行评估的。
创建一个允许第三方代码运行同时保护自己的系统是极其困难的,并且充满了搬起石头砸自己脚的机会。试图制定自己的解决方案是一个非常糟糕的主意。
幸运的是,有许多由非常聪明的人创建的经过良好测试的项目,致力于确保第三方代码的安全运行。最突出的两个是Google Caja和 Douglas Crockford 的ADsafe。
正如 @Barmar 指出的,JSFiddle 在不同域的 iframe 中运行代码,这会导致浏览器由于Same Origin Policy不允许 iframe 中的代码访问父页面。