關(guān)于javascript解決閉包漏洞的一個(gè)問題詳解
解決閉包漏洞的一個(gè)問題
在不修改下面代碼的情況下,修改obj的內(nèi)容
var o = (()=>{ var obj = { a:1, b:2, }; return { get :(n)=>{ return obj[n] } } })()
上面代碼就是一個(gè)典型的閉包模式。屏蔽掉obj本身。只能訪問閉包返回的數(shù)據(jù)而不能去修改數(shù)據(jù)源本身,但是他的數(shù)據(jù)源是一個(gè)對(duì)象,這就會(huì)出現(xiàn)一個(gè)漏洞!?。?!,而上面的代碼就會(huì)出現(xiàn)一個(gè)致命的漏洞。
問題原理:
console.log(o.get("a"));//1 console.log(o.get("b"));//2
貌似我們?cè)跊]有可選值傳入了?但是你要記住,在js中萬(wàn)物皆是對(duì)象,對(duì)象通過原型來(lái)繼承原型對(duì)象上的屬性和方法。
Object.protoType()
原型對(duì)象。
方法一:
那我能不能去訪問到原型valueOf
,暫時(shí)說想通過valueOf()來(lái)獲取這個(gè)對(duì)象本身。
JavaScript 中的 valueOf() 方法用于返回指定對(duì)象的原始值,若對(duì)象沒有原始值,則將返回對(duì)象本身。
console.log(o.get("valueOf")); //[Function: valueOf] let obj2 = o.get("valueOf")() //TypeError: Cannot convert undefined or null to object
可以看的出來(lái),報(bào)錯(cuò),這是因?yàn)関alueOf函數(shù)的this指向發(fā)生了錯(cuò)誤
方法二:
- 雖然提供了一個(gè)函數(shù)進(jìn)入傳參,但是傳入的權(quán)限很大,就會(huì)有很大的問題。
- 有沒有一種方法,直接訪問對(duì)象的屬性的時(shí)候通過一個(gè)函數(shù)來(lái)獲取,這時(shí)候就是構(gòu)造器屬性。
- 給對(duì)象的原型設(shè)置一個(gè)訪問器屬性
Object.defineProperty(Object.prototype,"abc",{ get(){ return this } }) console.log(o.get("abc"));//{ a: 1, b: 2 }
在這里就會(huì)通過訪問這個(gè)原型鏈上的訪問器屬性來(lái)返回一個(gè)訪問它這個(gè)的對(duì)象,這樣我就拿到了這個(gè)對(duì)象。
let obj = o.get("abc") obj.a='hjkasd' obj.b='12345' obj.c='勇敢牛牛,不怕困難' console.log(obj);//{ a: 'hjkasd', b: '12345', c: '勇敢牛牛,不怕困難' }
這就導(dǎo)致一個(gè)很嚴(yán)重的問題。我能修改 閉包的值。如果是第三方庫(kù)。那很輕易的破壞了庫(kù)的結(jié)構(gòu)。
解決辦法;
我剛才通過訪問原型鏈上的屬性,達(dá)到返回這個(gè)尋求的對(duì)象。從而破會(huì)掉結(jié)構(gòu)。
那么就需要判斷訪問的屬性是否來(lái)自對(duì)象本身。從而返回不同的值。
var o = (()=>{ var obj = { a:1, b:2, }; return { get :(n)=>{ if(!obj.hasOwnProperty(n)){ return `${n}在此對(duì)象本身不存在` } return obj[n] } } })()
解決方法二:
直接設(shè)置這個(gè)對(duì)象的原型為null,沒有原型鏈,那我上面的邏輯就行不通,自然就保護(hù)了數(shù)據(jù)的隱私性。
var o = (()=>{ let obj = { a:1, b:2, }; Object.setPrototypeOf(obj,null) return { get :(n)=>{ return obj[n] } } })()
總結(jié)
到此這篇關(guān)于javascript解決閉包漏洞的一個(gè)問題的文章就介紹到這了,更多相關(guān)js解決閉包漏洞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Javascript數(shù)組方法reduce的妙用之處分享
這篇文章主要給大家介紹了關(guān)于Javascript數(shù)組方法reduce的妙用之處,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Javascript具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06使用post方法實(shí)現(xiàn)json往返傳輸數(shù)據(jù)的方法
今天小編就為大家分享一篇關(guān)于使用post方法實(shí)現(xiàn)json往返傳輸數(shù)據(jù)的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03js實(shí)現(xiàn)的拖動(dòng)后記錄軌跡并運(yùn)行
軌跡拖動(dòng)(拖影效果)2010-06-06返回頁(yè)面頂部top按鈕通過錨點(diǎn)實(shí)現(xiàn)(自寫)
用戶在使用系統(tǒng)時(shí),會(huì)有很多表單的操作然而很多表單就會(huì)很長(zhǎng),所以就需要一個(gè)返回頁(yè)面頂部的top按鈕啦,于是自己寫了一個(gè),喜歡的朋友可以參考下2013-08-08JavaScript性能優(yōu)化之函數(shù)節(jié)流(throttle)與函數(shù)去抖(debounce)
這篇文章主要介紹了JavaScript性能優(yōu)化之函數(shù)節(jié)流(throttle)與函數(shù)去抖(debounce)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08javascript實(shí)現(xiàn)簡(jiǎn)單的全選和反選功能
這篇文章主要介紹了javascript實(shí)現(xiàn)簡(jiǎn)單的全選和反選功能的相關(guān)資料,需要的朋友可以參考下2016-01-01javascript讀取xml實(shí)現(xiàn)javascript分頁(yè)
這篇文章主要介紹了javascript讀取xml數(shù)據(jù)對(duì)其實(shí)現(xiàn)javascript分頁(yè)效果,大家參考使用吧2013-12-12