背景:我正在开发一个框架/库,用于与greasemonkey/userscripts 协调的特定站点。这个框架/库将允许插件支持。它的工作方式是在库中注册一个插件,列出所需的页面、资源等,并且该库将等到满足所有条件才能调用插件的load()
函数。
问题:在这个“必需的东西”列表中,我希望插件开发人员能够指定要评估为“必需资源”的 javascript(作为字符串)。例如'document.getElementById("banana")'
. 我想要做的是半沙箱评估“所需资源”,因此评估可以访问窗口和 DOM 对象,但不能直接更改它们。我还想让 eval 和 evalJS 无法从沙箱中访问。
例子:
document.getElementById("banana")
-> 有效document.getElementById("apple).id = "orange"
-> 无效window.grape
-> 有效window.grape = 'potato'
-> 无效(someObj.applesCount > 0 ? 'some' : 'none')
-> 有效
到目前为止我所拥有的:
function safeEval(input) {
// Remove eval and evalJS from the window:
var e = [window.eval, window.evalJS], a;
window.eval = function(){};
window.evalJS = function(){};
try {
/* More sanition needed before being passed to eval */
// Eval the input, stuffed into an annonomous function
// so the code to be evalued can not access the stored
// eval functions:
a = (e[0])("(function(){return "+input+"}())");
} catch(ex){}
// Return eval and evalJS to the window:
window.eval = e[0];
window.evalJS = e[1];
// Return the eval'd result
return a;
}
注意:
这是一个 Greasemonkey/用户脚本。我没有直接访问权限来更改站点,或者它是 javascript。
for 的输入safeEval()
可以是任何有效的 javascript,可以是 DOM 查询,也可以是简单的求值,只要它不改变窗口对象或 DOM。