当前位置:  开发笔记 > 编程语言 > 正文

将eval()限制在狭窄的范围内

如何解决《将eval()限制在狭窄的范围内》经验,为你挑选了1个好方法。

我有一个javascript文件,读取另一个文件,其中可能包含需要eval() - ed的javascript片段.脚本片段应该符合javascript的严格子集,这限制了它们可以做什么以及它们可以更改哪些变量,但我想知道是否有某种方法可以通过阻止eval在全局范围内查看变量来强制执行此操作.类似于以下内容:

function safeEval( fragment )
{
    var localVariable = g_Variable;

    {
        // do magic scoping here so that the eval fragment can see localVariable
        // but not g_Variable or anything else outside function scope

        eval( fragment );
    }
}

实际的代码不需要看起来像这样 - 我对任何和所有带闭包的奇怪技巧都是开放的等等.但我确实想知道这是否可能.



1> Shog9..:

简答:不.如果它在全球范围内,它可用于任何事物.

答案:如果你是eval()不信任的代码,真的想要阅读或搞乱你的执行环境,那你就搞砸了.但是,如果您拥有并信任正在执行的所有代码,包括正在执行的代码eval(),您可以通过覆盖执行上下文来伪造它:

function maskedEval(scr)
{
    // set up an object to serve as the context for the code
    // being evaluated. 
    var mask = {};
    // mask global properties 
    for (p in this)
        mask[p] = undefined;

    // execute script in private context
    (new Function( "with(this) { " + scr + "}")).call(mask);
}

我必须再次强调:

这仅用于屏蔽受信任的代码与执行它的上下文.如果您不信任代码,请不要eval()(或将其传递给新代码Function(),或以任何其他方式使用它eval()).


阅读最后的警告,@ meph - 不要提供你没有写/控制的任何东西.
你能举个例子,这怎么会不好?我确实检查了一些但没有发现一些...我将阻止变量定义,如var test = 1
我能想到的最简单的错误表达是:(function(){this.document.anythingYouWant ...})。call(null); 当使用不带“ this”参数的调用时,“ this”成为全局上下文。
推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有