我需要运行一个完全由用户编写的 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() http://www.w3schools.com/jsref/jsref_eval.asp函数以及如何使用它来运行代码。我还阅读了 StackOverflow 上的其他文章(jsFiddle 如何运行代码 https://stackoverflow.com/questions/8004001/how-does-jsfiddle-allow-and-execute-user-defined-javascript-without-being-danger, 一般评估 https://stackoverflow.com/questions/939326/execute-javascript-code-stored-as-a-string等),但我仍然不确定如何正确执行。
首先:什么是真正的问题eval()
?攻击者可以做什么以及如何防止攻击(使用白名单、黑名单或用户输入清理库)?
谁能深入解释 jsFiddle 和此类网站如何执行用户输入?
运行不受信任的 JavaScript 的正确方法是将其放入沙盒环境中。这是一个使用的技术入狱图书馆 https://github.com/asvd/jailed我自己出于上述目的而编写的:
对于 Node.js:
创建子流程;
将代码作为字符串加载(如果有路径,则读取文件内容);
Add use strict;
在代码的开头(为了防止使用破坏沙箱arguments.callee.caller
);
使用以下命令在单独的上下文中评估该字符串vm.runInNewContext()
,其中提供的sandbox
只公开一些基本方法,例如setTimeout()
.
对于网络浏览器:
创建一个 iframe,其中包含沙箱属性 http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/(使其内容遵守跨域策略,因此无法访问主应用程序);
在该 iframe 内创建一个 web-worker(以便用户提交的代码将获得自己的线程,因此不会冻结 UI)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)