编程语言
首页 > 编程语言> > 有没有办法在Javascript中监禁,以便DOM不可见

有没有办法在Javascript中监禁,以便DOM不可见

作者:互联网

我真的想为用户提供一些脚本功能,同时不让它访问更强大的功能,比如改变DOM.也就是说,所有输入/输出都通过给定接口进行隧道传输.就像一种受限制的javacsript.

例:
如果界面是checkanswer(func)
这是允许的:

checkanswer( function (x,y)={
   return x+y;
}

但这些是不允许的:
警报(1)
document.write(“hello world”)
的eval( “警报()”)

编辑:我的想法是一个简单的语言,使用javascript实现,像http://stevehanov.ca/blog/index.php?id=92

解决方法:

(编辑此答案与您的编辑前问题有关.不知道使用Javascript实现的任何脚本语言,虽然我希望有一些.例如,有人为Javascript写了一个BASIC(曾经有一个链接,但是因此,这个答案的其余部分非常具有学术性,但我只是为了讨论,插图,甚至是警示目的而留下它.而且,我绝对同意bobince’s points – 不要自己这样做,使用它的工作其他人,如Caja.)

如果您允许在用户生成的内容中使用任何脚本,那么请准备好您将进入人们争夺保护机制漏洞并利用它们的军备竞赛,并回应这些漏洞.我想我可能会回避它,但你知道你的社区和你处理虐待的选择.所以如果你准备好了:

由于Javascript执行符号解析的方式,似乎应该可以在窗口,文档,ActiveXObject,XMLHttpRequest等类似的上下文中评估脚本:

// Define the scoper
var Scoper = (function() {
    var rv = {};

    rv.scope = function(codeString) {
        var window,
            document,
            ActiveXObject,
            XMLHttpRequest,
            alert,
            setTimeout,
            setInterval,
            clearTimeout,
            clearInterval,
            Function,
            arguments;
            // etc., etc., etc.

        // Just declaring `arguments` doesn't work (which makes
        // sense, actually), but overwriting it does
        arguments = undefined;

        // Execute the code; still probably pretty unsafe!
        eval(codeString);
    };

    return rv;;
})();

// Usage:
Scoper.scope(codeString);

(现在使用邪恶的eval,但我不能立即想到一种方法来在不使用eval的情况下跨浏览器隐藏默认对象,如果你接收代码作为文本,无论如何……)

但它不起作用,它只是一个部分解决方案(更多下面).逻辑是,codeString中代码访问窗口(例如)中的任何尝试都将访问局部变量窗口,而不是全局;和其他人一样.不幸的是,由于解析符号的方式,可以使用或不使用窗口访问窗口的任何属性.前缀(例如,alert),所以你也必须列出这些.这可能是一个很长的列表,尤其是因为bobince指出,IE将任何带有名称或ID的DOM元素转储到窗口上.因此,您可能必须将所有这些放在自己的iframe中,这样您就可以针对该问题进行最终运行,并且“只”必须处理标准内容.还要注意我如何使作用域属性成为对象的属性,然后只通过属性调用它.这样就可以将它设置为Scoper实例(否则,在原始函数调用中,默认为window!).

但是,正如鲍勃指出的那样,有很多不同的方法可以解决问题.例如,codeString中的这段代码成功地打破了上面的监狱:

(new ('hello'.constructor.constructor)('alert("hello from global");'))()

现在,也许你可以更新jail以使特定的漏洞利用不起作用(在所有 – 所有内置对象上使用构造函数属性),但我倾向于怀疑它.如果可以的话,有人(比如Bob)会想出一个新的漏洞,就像这个:

(function(){return this;})().alert("hello again from global!");

因此,“军备竞赛”.

唯一真正彻底的方法是在您的站点中内置一个正确的Javascript解析器,解析他们的代码并检查非法访问,然后让代码运行.这是很多工作,但如果你的用例证明它……

标签:restriction,javascript,dom,scripting
来源: https://codeday.me/bug/20190928/1827520.html