[英]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:
创建子流程;
将代码加载为字符串(如果有路径,请读取文件内容);
添加use strict;
在代码的开头(为了防止使用arguments.callee.caller
破坏沙箱);
使用vm.runInNewContext()
在单独的上下文中评估该字符串,其中提供的sandbox
仅公开一些基本方法,如setTimeout()
。
对于网络浏览器:
使用沙箱属性创建iframe(以使其内容服从跨源策略,因此无法访问主应用程序);
在iframe中创建一个web-worker(这样用户提交的代码将获得自己的线程,因此不会冻结UI)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.