SRe*_*ect 5 javascript greasemonkey eval sandbox
背景:我正在开发一个框架/库,用于与greasemonkey/userscripts协调的特定站点.该框架/库将允许插件支持.它的工作方式是一个插件寄存器,库中列出了所需的页面,资源,ectera和库将等到所有的critera都满足调用addon的load()
功能.
问题:在这个"必需的东西"列表中,我希望addon devs能够指定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;
}
Run Code Online (Sandbox Code Playgroud)
注意:
这是Greasemonkey/userscript.我没有直接访问权限来改变网站,或者它是javascript.
输入safeEval()
可以是任何有效的javascript,无论是DOM查询,还是简单的评估,只要它不会改变窗口对象或DOM.
没有绝对的方法可以阻止最终用户或插件开发人员在JavaScript中执行特定代码.这就是为什么像JavaScript这样的开源语言中的安全措施被认为是万无一失的(因为它只对傻瓜有效).
不过要说的是,让我们构建一个沙盒安全层,以防止没有经验的开发人员破坏您的网站.我个人更喜欢使用Function
构造函数eval
来执行用户代码,原因如下:
jQuery
).this
指针并创建名为的局部变量window
,document
以防止访问全局范围和DOM.这允许您创建自己的DOM版本并将其传递给用户代码.但请注意,即使这种模式也有缺点.最重要的是,它可能只会阻止直接访问全球范围.用户代码仍然可以通过简单地声明变量来创建全局变量var
,恶意代码可能会使用诸如创建函数之类的黑客并使用它的this
指针来访问全局范围(JavaScript的默认行为).
那么让我们看看一些代码:http://jsfiddle.net/C3Kw7/
归档时间: |
|
查看次数: |
5179 次 |
最近记录: |