广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >关于javascript解决闭包漏洞的一个问题详解
  • 605
分享到

关于javascript解决闭包漏洞的一个问题详解

摘要

目录解决闭包漏洞的一个问题问题原理:方法一:方法二:解决办法;解决方法二:总结解决闭包漏洞的一个问题 在不修改下面代码的情况下,修改obj的内容 var o = (()=>{

解决闭包漏洞的一个问题

在不修改下面代码的情况下,修改obj的内容

var o = (()=>{
    var obj = {
        a:1,
        b:2,
    };
    return {
        get :(n)=>{
            return obj[n]
        }
    }
})()

上面代码就是一个典型的闭包模式。屏蔽掉obj本身。只能访问闭包返回的数据而不能去修改数据源本身,但是他的数据源是一个对象,这就会出现一个漏洞!!!!,而上面的代码就会出现一个致命的漏洞。

问题原理:

console.log(o.get("a"));//1
console.log(o.get("b"));//2

貌似我们在没有可选值传入了?但是你要记住,在js中万物皆是对象,对象通过原型来继承原型对象上的属性和方法。

Object.protoType()原型对象。

方法一:

那我能不能去访问到原型valueOf,暂时说想通过valueOf()来获取这个对象本身。

javascript 中的 valueOf() 方法用于返回指定对象的原始值,若对象没有原始值,则将返回对象本身。

console.log(o.get("valueOf"));
//[Function: valueOf]
let obj2 = o.get("valueOf")()
//TypeError: Cannot convert undefined or null to object

可以看的出来,报错,这是因为valueOf函数的this指向发生了错误

方法二:

  • 虽然提供了一个函数进入传参,但是传入的权限很大,就会有很大的问题。
  • 有没有一种方法,直接访问对象的属性的时候通过一个函数来获取,这时候就是构造器属性。
  • 给对象的原型设置一个访问器属性
Object.defineProperty(Object.prototype,"abc",{
    get(){
        return this
    }
})
console.log(o.get("abc"));//{ a: 1, b: 2 }

在这里就会通过访问这个原型链上的访问器属性来返回一个访问它这个的对象,这样我就拿到了这个对象。

let obj = o.get("abc")
obj.a='hjkasd'
obj.b='12345'
obj.c='勇敢牛牛,不怕困难'
console.log(obj);//{ a: 'hjkasd', b: '12345', c: '勇敢牛牛,不怕困难' }

这就导致一个很严重的问题。我能修改 闭包的值。如果是第三方库。那很轻易的破坏了库的结构。

解决办法;

我刚才通过访问原型链上的属性,达到返回这个寻求的对象。从而破会掉结构。

那么就需要判断访问的属性是否来自对象本身。从而返回不同的值。

var o = (()=>{
    var obj = {
        a:1,
        b:2,
    };
    return {
        get :(n)=>{
            if(!obj.hasOwnProperty(n)){
                return `${n}在此对象本身不存在`
            }
            return obj[n]
        }
    }
})()

解决方法二:

直接设置这个对象的原型为null,没有原型链,那我上面的逻辑就行不通,自然就保护了数据的隐私性。

var o = (()=>{
    let obj = {
        a:1,
        b:2,
    };
    Object.setPrototypeOf(obj,null)
    return {
        get :(n)=>{
            return obj[n]
        }
    }
})()

总结

到此这篇关于javascript解决闭包漏洞的一个问题的文章就介绍到这了,更多相关js解决闭包漏洞内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 关于javascript解决闭包漏洞的一个问题详解

本文链接: https://www.lsjlt.com/news/170648.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作