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

 更新时间:2022年11月03日 09:26:57   作者:勇敢*牛牛  
闭包在JavaScript高级程序设计(第3版)中是这样描述:闭包是指有权访问另一个函数作用域中的变量的函数,下面这篇文章主要给大家介绍了关于javascript解决闭包漏洞的一个问题的相关资料,需要的朋友可以参考下

解决闭包漏洞的一个问题

在不修改下面代码的情况下,修改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解决闭包漏洞内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • freemarker判断对象是否为空的方法

    freemarker判断对象是否为空的方法

    FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出,用FreeMarker判断对象是否为空的方法大家知道吗,这篇文章就针对这个知道点做介绍,需要的朋友可以参考下
    2015-08-08
  • webpack打包js的方法

    webpack打包js的方法

    这篇文章主要介绍了webpack打包js的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • 使用setTimeout实现SetInterval原理解析

    使用setTimeout实现SetInterval原理解析

    这篇文章主要为大家介绍了使用setTimeout实现SetInterval原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 微信小程序登录态和检验注册过没的app.js写法

    微信小程序登录态和检验注册过没的app.js写法

    这篇文章主要介绍了小程序登录态和检验注册过没的app.js写法, 本文通过实例代码给大家介绍的非常详细,具有一定的借鉴价值,需要的朋友可以参考下
    2019-05-05
  • JS代码触发事件代码实例

    JS代码触发事件代码实例

    这篇文章主要介绍了js代码触发事件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 详解V8是如何执行一段JavaScript代码原理

    详解V8是如何执行一段JavaScript代码原理

    这篇文章主要为大家介绍了详解V8是如何执行一段JavaScript代码原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • JS 加入收藏夹的代码(主流浏览器通用)

    JS 加入收藏夹的代码(主流浏览器通用)

    所有浏览器通用的js添加收藏夹代码,本文整理了多种方法实现加入收藏夹功能,下面为大家详细介绍下实现代码,感兴趣的朋友可以参考下哈
    2013-05-05
  • 基于Layui自定义模块的使用方法详解

    基于Layui自定义模块的使用方法详解

    今天小编就为大家分享一篇基于Layui自定义模块的使用方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • 原生JS实现匀速图片轮播动画

    原生JS实现匀速图片轮播动画

    这篇文章主要为大家详细介绍了原生JS实现匀速图片轮播动画,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 一些常用的Javascript函数

    一些常用的Javascript函数

    一些常用的Javascript函数...
    2006-12-12

最新评论