半沙盒Javascript评估

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.

Aad*_*hah 5

没有绝对的方法可以阻止最终用户或插件开发人员在JavaScript中执行特定代码.这就是为什么像JavaScript这样的开源语言中的安全措施被认为是万无一失的(因为它只对傻瓜有效).

不过要说的是,让我们构建一个沙盒安全层,以防止没有经验的开发人员破坏您的网站.我个人更喜欢使用Function构造函数eval来执行用户代码,原因如下:

  1. 代码包含在匿名函数中.因此,它可以存储在变量中并根据需要多次调用.
  2. 该函数始终存在于全局范围中.因此,它无法访问创建该函数的块中的局部变量.
  3. 该函数可以传递任意命名参数.因此,您可以利用此功能来传递或导入用户代码所需的模块(例如jQuery).
  4. 最重要的是,您可以设置自定义this指针并创建名为的局部变量window,document以防止访问全局范围和DOM.这允许您创建自己的DOM版本并将其传递给用户代码.

但请注意,即使这种模式也有缺点.最重要的是,它可能只会阻止直接访问全球范围.用户代码仍然可以通过简单地声明变量来创建全局变量var,恶意代码可能会使用诸如创建函数之类的黑客并使用它的this指针来访问全局范围(JavaScript的默认行为).

那么让我们看看一些代码:http://jsfiddle.net/C3Kw7/