你能在这个javascript问题上找到任何可用的安全威胁吗?

Can you find any security threat available on this javascript problem?

本文关键字:任何可 安全 威胁 javascript 问题      更新时间:2023-09-26

假设我有如下代码:

object[hash].init();

请假设哈希来自网站哈希(www.example.com#哈希)。

在我上面显示的代码中是否存在任何可能的安全漏洞?例如,是否有可能在#散列中放入任何注入并触发任何恶意代码的代码?

谢谢。

这将没有问题,hash而不是被评估为JavaScript代码,它将被视为字符串。如果hash的值不是object的有效属性名,object[hash]将返回undefined,您将得到一个错误(不能在undefined上调用init)。

另一方面,如果您使用hash的方式将字符串作为JavaScript代码求值,那么存在安全问题。

object[hash].init();

,但这是而不是(即使有内引号):

setTimeout("object['" + hash + "'].init();", 100);

例如,如果hash是包含

的字符串
']; alert('foo'); object['something

则执行alert('foo');。在不破坏代码的情况下注入和执行代码是可能的。


那就是说,我仍然不会这样做。它将代码过多地捆绑在一起。我可能会创建一个函数映射(与您的示例类似,但不相同):

var hashCodes = {
    'someHash': function() {
        object.something.init();
    }
};
if(hashCodes.hasOwnProperty(hash)) {
    hashCodes[hash]();
}

这不是真正的安全问题,更多的是设计问题,但是从公开的URL访问可能是内部数据结构的内容可能会使恶意用户以意想不到的方式操纵您的代码。虽然这不会直接暴露安全漏洞,但意外的代码行为会使风险更容易潜入代码。但是,如果您确定以"错误"的顺序调用init()方法即使发生也没关系,那么就没有问题了。

唯一可能导致问题的方法是使用ES6 harmony代理。

代理允许您捕获所有方法。参见FF代理

var object = Proxy({
  "get": function _get(obj, name) {
    // name is an evil string containing javascript
    eval(name); // security risk
    return {
      "init": function _init() {
        // init code
      }
    };
  }
});

没有其他的方法来实现一个全面的。这个特殊的全捕获将计算name