JavaScript闭包漏洞与修补措施

这篇具有很好参考价值的文章主要介绍了JavaScript闭包漏洞与修补措施。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

请先看下面一段代码

	var obj = (function () {
	  var sonObj = {
	    a: 1,
	    b: 2
	  }
	  return {
	    get: function (v) {
	      return sonObj[v]
	    }
	  }
	})()

可以看出,这是一段很典型的js闭包代码,可以通过obj调用get方法传一个参数,如果传的是a就可以得到闭包内的对象sonObj.a

	var obj = (function () {
	  var sonObj = {
	    a: 1,
	    b: 2
	  }
	  return {
	    get: function (v) {
	      return sonObj[v]
	    }
	  }
	})()
	console.log(obj.get('a'))

如下,正确的获取到了sonObj的属性a
JavaScript闭包漏洞与修补措施,JavaScript随想,JavaScript闭包问题,JavaScript闭包漏洞,js闭包漏洞修补,js闭包漏洞,如何获取到闭包环境下的数据
这是一个典型的闭包场景,这样做的目的是为了屏蔽这个obj,不让外边直接访问它,只能读取它的某一个属性,这样就保护了数据的完整性
但这样做有一个问题
,那就是没有处理js闭包的漏洞,给的权限太大了
用户可以通过,obj.get访问到sonObj的任何成员,包括prototype上的成员
所以我们就可以利用可以访问prototype来达到我们想要做的事
我们都知道对象上的value上的valueOf这个方法会返回对象自身
也就是说,我们能通过

obj.valueOf()

来获取到这个对象,方向有了,但是这样还不够.如下

var obj = (function () {
  var sonObj = {
    a: 1,
    b: 2
  }
  return {
    get: function (v) {
      return sonObj[v]
    }
  }
})()
console.log(obj.get('valueOf')())

JavaScript闭包漏洞与修补措施,JavaScript随想,JavaScript闭包问题,JavaScript闭包漏洞,js闭包漏洞修补,js闭包漏洞,如何获取到闭包环境下的数据

如上图,报错了
Uncaught TypeError: Cannot convert undefined or null to object
无法将未定义或 null 转换为对象
为什么会出现这种问题呢?
这是因为this指向的问题
因为我们只有通过sonObj调用valueOf的时候,才能返回sonObj对象
而obj.get(‘valueOf’)()明显不是,是通过get方法获取到了valueOf这个方法本身,然后通过这个方法本身去调用的,那么这时候this的指向就变成了全局
所以这种方法是行不通了,那需要怎么办呢?
很简单,我们只需要让sonObj的某一个成员,在被读取的时候,返回它自身就好了,
如下,我们让object的原型上添加一个方法,让这个方法被访问的时候,返回它

Object.defineProperty(Object.prototype,'aaa',{
	get(){
		return this
	}
}

这样,当访问aaa这个属性的时候,sonObj没有这个成员,就会去prototype上找,然后就会调用prototype上的aaa方法,然后就把自己返回出去了,闭包也就破解了

	var obj = (function () {
	  var sonObj = {
	    a: 1,
	    b: 2
	  }
	  return {
	    get: function (v) {
	      return sonObj[v]
	    }
	  }
	})()
	Object.defineProperty(Object.prototype,'aaa',{
		get(){
			return this
		}
	})
	console.log(obj.get('aaa'))

JavaScript闭包漏洞与修补措施,JavaScript随想,JavaScript闭包问题,JavaScript闭包漏洞,js闭包漏洞修补,js闭包漏洞,如何获取到闭包环境下的数据
诺,sonObj就到手了

那话又说回来了,该怎么防御呢?
简单,它不是原型上整活吗?,我们让sonObj原型指向null,欸,我没有原型了,也就不存在这种错误了
头痛?把脑袋砍了,就再也不会头痛了,简直是太妙了~

	var obj = (function () {
	  var sonObj = {
	    a: 1,
	    b: 2
	  }
	  Object.setPrototypeOf(sonObj,null)
	  return {
	    get: function (v) {
	      return sonObj[v]
	    }
	  }
	})()
	Object.defineProperty(Object.prototype,'aaa',{
		get(){
			return this
		}
	})
	console.log(obj.get('aaa'))

JavaScript闭包漏洞与修补措施,JavaScript随想,JavaScript闭包问题,JavaScript闭包漏洞,js闭包漏洞修补,js闭包漏洞,如何获取到闭包环境下的数据
但是在实际开发中一般不这么做,因为原型树上可能有别的方法能用得上,所以我们可以在sonObj的方法内加个判断,如果是对象上的成员就让他正常返回,如果不是就返回undefinded,

	var obj = (function () {
	  var sonObj = {
	    a: 1,
	    b: 2
	  }
	  return {
	    get: function (v) {
	    if(obj.hasOwnProperty(v))
	      return sonObj[v]
	      return undefined
	    }
	  }
	})()
	Object.defineProperty(Object.prototype,'aaa',{
		get(){
			return this
		}
	})
	console.log(obj.get('aaa'))

JavaScript闭包漏洞与修补措施,JavaScript随想,JavaScript闭包问题,JavaScript闭包漏洞,js闭包漏洞修补,js闭包漏洞,如何获取到闭包环境下的数据
不过这样写其实又出现了新的问题,关于直接手写undefined的问题,但是这里就不展开说了文章来源地址https://www.toymoban.com/news/detail-685460.html

到了这里,关于JavaScript闭包漏洞与修补措施的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JavaScript闭包详细介绍

    闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见方式是让一个内嵌函数访问其外部(父级)函数的变量,即使外部函数已经执行完毕,其变量仍然存在于内存中。闭包的主要特点是它可以“记住”外部函数的变量。 变量持久化: 闭包能够保持对外部作

    2024年02月20日
    浏览(22)
  • JavaScript 作用域与闭包

    本文内容学习于:后盾人 (houdunren.com) 1.作用域 1)函数被执行后其环境变量将从内存中删除。下面函数在每次执行后将删除函数内部的 total 变量。  function count() {         let total = 0; } count (); 2)函数每次调用都会创建一个新作用域 3)如果子函数被使用时父级环境将被保留

    2024年02月14日
    浏览(24)
  • JavaScript高级:闭包与作用域

    在 JavaScript 的世界里,闭包是一个令人着迷且神秘的概念,它为我们提供了一种强大的能力,能够在函数内部捕获并保留外部作用域的变量。本文将详细解释闭包的概念与应用,带你揭开 JavaScript 的神秘面纱,通俗易懂地理解闭包的奥秘。 1. 作用域与闭包的关系 作用域是指

    2024年02月13日
    浏览(28)
  • JavaScript(函数,作用域和闭包)

    类似于Java中的方法,是完成特定任务的代码语句块 特点 使用更简单 不用定义属于某个类,直接调用执行 分类 系统函数 自定义函数 1.将字符串转换为整型数字 js示例1 从下标为0起,依次判断每个字符是否可以转换为一个有效数字 如果不是有效数字,则返回NaN,不再继续执

    2024年02月10日
    浏览(29)
  • 浅谈XSS漏洞原理及防御措施

    XSS全称跨站脚本(Cross Site Scripting),为避免与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故缩写为XSS。这是一种将任意 Javascript 代码插入到其他Web用户页面里执行以达到攻击目的的漏洞。攻击者利用浏览器的动态展示数据功能,在HTML页面里嵌入恶意代码。当用户浏览改页时

    2024年02月02日
    浏览(31)
  • 深入理解JavaScript闭包:从概念到实践

    JavaScript是一门强大且灵活的编程语言,而闭包(Closure)则是JavaScript中一个非常重要且常用的概念。虽然闭包在JavaScript开发中经常被提及,但它的概念和工作原理可能对一些开发者来说仍然有些模糊。本篇博客旨在帮助读者深入理解JavaScript闭包,从概念到实践,让您能够充

    2024年02月16日
    浏览(33)
  • 【面试高频】JavaScript作用域、闭包、变量提升

    目录 前言 一、作用域 1. 局部作用域 2. 全局作用域 二、作用域链 三、闭包 1. 闭包是什么 2. 闭包的运用 JavaScript 中的作用域、闭包和变量提升是 JavaScript 中的重要概念,也是面试高频考点。 作用域规定了变量的可见性和生命周期,闭包通过捕获自由变量的方式延长了变量的

    2024年02月12日
    浏览(24)
  • 网站代码sql注入攻击漏洞修复加固防护措施

    什么是SQL注入攻击? SQL注入是一种网站的攻击方法。它将SQL代码添加到网站前端GET POST参数中,并将其传递给mysql数据库进行分析和执行语句攻击。 如何生成SQL注入漏洞的? 1。网站程序员以及运维技术是不能保证所有的前端输入都被安全效验与拦截过滤。 2。攻击者使用发送

    2024年02月01日
    浏览(35)
  • 我从来不理解JavaScript闭包,但我用了它好多年

    前言  📫 大家好,我是南木元元,热衷分享有趣实用的文章,希望大家多多支持,一起进步!  🍅  个人主页: 南木元元 你是否学习了很久JavaScript但还没有搞懂闭包呢?今天就来聊一下被很多人誉为JavaScript中最难理解的概念之一的闭包。 目录 闭包的概念 闭包产生的原因

    2024年02月05日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包