【问题标题】:Use eval without threat of XSS在没有 XSS 威胁的情况下使用 eval
【发布时间】:2011-05-10 00:56:44
【问题描述】:

我正在制作(不是现在,但我仍然对这个游戏很好奇)使用 HTML5 和 JS 的游戏,我想要的是人们可以插入自定义脚本,但安全。

function executeCustomJS(code){
 eval(code);//bad
}

当然这段代码很糟糕,因为如果代码类似于document.location.href='http://meatspn.com',那么结果会变得非常...(...)

我找到的一个解决方案是转义(如eval -> ___eval___)所有关键字,并在白名单中取消转义关键字,例如'while'、'for'、'if'、'var'、' true', 'false', ... 和 'func0', 'func1', ....,它们是游戏的东西(类似于 API)并且是安全的。

例如,

function executeCustomJS(code){
 code = code.replace(/(Keyword RegEx)/g,'___$1___');
 /*unescape keywords in whitelist*/
 eval(code);
}

我还没有发表正则表达式和评论,但这不是问题。

假设代码中的字符串没有转义,没有可以通过转义字符串来实现的功能,并且'eval','window','document','alert','location'不在白名单中。还有一些人可以执行while(true){}这样的代码,他们不能执行document.location.href='http://meatspn.com'这样的任何代码。

这种方法安全吗?或者,是否存在更好的方法?

【问题讨论】:

    标签: javascript security xss eval


    【解决方案1】:

    我建议您通过 JSON 公开有限的脚本语言。所以记录一个脚本引擎,它需要你创建一个 JSON 对象作为你的代码。

    这具有很大的优势,即不可能将错误代码注入 JSON,因为它只是数据。

    因此,您可以为脚本代码创建某种声明性语法。例如

    {
        "0": {
            "Action": "move",
            "X": 10,
            "Y": -5
        },
        "1": {
            "Action": "emote",
            "type": "dance"
        }
    }
    

    对于小型声明性脚本语言来说,什么是好的设计是一个完全不同的问题。

    【讨论】:

    • 如果应该是 JSON,则需要将属性名称视为字符串。 { "Action": ...
    • 谢谢! (但我还是很好奇我的方法是否安全……)
    • @tylermwashburn 它实际上是一个对象文字。但是是的,JSON 需要字符串中的属性。 @JiminP 只有当您比我更了解javascript 时,它才是安全的;)。我可以看到您的白名单解析器,您已将其发送给我。我能找到里面所有的洞。你会一遍又一遍地看meatspn :)
    • @Raynos 使用对象文字,您仍然可以存储更多数据。 x: function () { bombJapan(); }
    • @tylermwashburn 这是真的。但是您不能通过JSON.parse 创建包含函数的对象文字。这个想法是加载 JSON,这个例子恰好是一个受 JSON 约束的对象字面量。也许我应该将示例更改为 JSON :)
    【解决方案2】:

    将用户可能希望做的任何事情公开为combinators,例如一种子语言。

    【讨论】:

      【解决方案3】:

      https://developers.google.com/caja/

      Caja 编译器是一种工具,可让第三方 HTML、CSS 和 JavaScript 安全地嵌入您的网站。它支持嵌入页面和嵌入应用程序之间的丰富交互。 Caja 使用对象能力安全模型来支持广泛的灵活安全策略,以便您的网站可以有效地控制嵌入式第三方代码可以对用户数据执行的操作。

      【讨论】:

        猜你喜欢
        • 2023-04-01
        • 2013-03-08
        • 2012-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-06
        相关资源
        最近更新 更多