關于javascript解決閉包漏洞的一個問題詳解
解決閉包漏洞的一個問題
在不修改下面代碼的情況下,修改obj的內(nèi)容
var o = (()=>{
var obj = {
a:1,
b:2,
};
return {
get :(n)=>{
return obj[n]
}
}
})()
上面代碼就是一個典型的閉包模式。屏蔽掉obj本身。只能訪問閉包返回的數(shù)據(jù)而不能去修改數(shù)據(jù)源本身,但是他的數(shù)據(jù)源是一個對象,這就會出現(xiàn)一個漏洞?。。?!,而上面的代碼就會出現(xiàn)一個致命的漏洞。
問題原理:
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函數(shù)的this指向發(fā)生了錯誤
方法二:
- 雖然提供了一個函數(shù)進入傳參,但是傳入的權限很大,就會有很大的問題。
- 有沒有一種方法,直接訪問對象的屬性的時候通過一個函數(shù)來獲取,這時候就是構造器屬性。
- 給對象的原型設置一個訪問器屬性
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: '勇敢牛牛,不怕困難' }
這就導致一個很嚴重的問題。我能修改 閉包的值。如果是第三方庫。那很輕易的破壞了庫的結(jié)構。
解決辦法;
我剛才通過訪問原型鏈上的屬性,達到返回這個尋求的對象。從而破會掉結(jié)構。
那么就需要判斷訪問的屬性是否來自對象本身。從而返回不同的值。
var o = (()=>{
var obj = {
a:1,
b:2,
};
return {
get :(n)=>{
if(!obj.hasOwnProperty(n)){
return `${n}在此對象本身不存在`
}
return obj[n]
}
}
})()
解決方法二:
直接設置這個對象的原型為null,沒有原型鏈,那我上面的邏輯就行不通,自然就保護了數(shù)據(jù)的隱私性。
var o = (()=>{
let obj = {
a:1,
b:2,
};
Object.setPrototypeOf(obj,null)
return {
get :(n)=>{
return obj[n]
}
}
})()
總結(jié)
到此這篇關于javascript解決閉包漏洞的一個問題的文章就介紹到這了,更多相關js解決閉包漏洞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
實現(xiàn)div內(nèi)部滾動條滾動到底部和頂部的代碼
下面筆者就為大家分享一篇實現(xiàn)div內(nèi)部滾動條滾動到底部和頂部的代碼,代碼簡潔,具有很好的參考價值,希望對大家有所幫助2017-11-11
javascript高級模塊化require.js的具體使用方法
本篇文章主要介紹了javascript高級模塊化require.js的具體使用方法,非常具有實用價值,需要的朋友可以參考下2017-10-10
微信小程序websocket聊天室的實現(xiàn)示例代碼
這篇文章主要介紹了微信小程序websocket聊天室的實現(xiàn)示例代碼,小程序本身對http、websocket等連接均有諸多限制,所以這次項目選擇了node.js自帶的ws模塊。感興趣的可以參考一下2019-02-02
IE6中鏈接A的href為javascript協(xié)議時不在當前頁面跳轉(zhuǎn)
IE6中當鏈接A的href為javascript協(xié)議時不能在當前頁面跳轉(zhuǎn),本例給出有效的解決方法,大家不妨參考下2014-06-06
利用Plupload.js解決大文件上傳問題, 帶進度條和背景遮罩層
本篇文章主要介紹了c#+Plupload.js解決大容量文件上傳問題, 帶進度條和背景遮罩層,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-03-03

