JavaScript的原型存在的安全問題及解決辦法
JavaScript的原型很多人都知道也很好用,但是很多人在使用原型繼承中導(dǎo)致的安全問題卻很少人知道,接下來我們就來好好了解一下。
在真實開發(fā)中,我們經(jīng)常會在代碼中使用Property accessors 屬性訪問器,并且使用用戶輸入的參數(shù)去訪問某個對象的屬性。這看起來可能是一個很稀疏平常的操作,但是往往在這個過程中我們的代碼就已經(jīng)產(chǎn)生了一個很大的安全漏洞?。。?/p>
為什么這樣寫代碼會產(chǎn)生安全問題?
我們可以看來一下,下面的一個示例
我們的訪問代碼
const internal = {
foo: {
bar: null
}
}
const acceptUserInput = (type, subtype, value) => {
internal[type][subtype] = value
}應(yīng)用:
// 正常的訪問
acceptUserInput('foo', 'bar', 'I am so clever')
// 惡意攻擊
acceptUserInput('__proto__', 'polluted', '你好我是黑客,權(quán)限是允許')在我們的惡意攻擊中,我們向我們的原型上添加了一個polluted屬性。導(dǎo)致我們所有新創(chuàng)建的對象都會多出一個polluted屬性,屬性的值是“你好我是黑客,權(quán)限是允許”,這就給了不懷好意的壞人,一個可乘之機(jī)。
const obj = {}
console.debug(obj.polluted) // '你好我是黑客,權(quán)限是允許'為什么會不安全呢?
如果在客戶端上,這可能問題不大,如果這是在服務(wù)器上,那就可能會為黑客攻擊提供漏洞。
假設(shè)黑客知道你的代碼在運(yùn)行時會創(chuàng)建一個新對象,并且你沒有使用Object.create(null)創(chuàng)建一個沒有原型的對象。
黑客通過在原型上添加屬性,他們可以解鎖更多用戶權(quán)限,比如網(wǎng)站修改權(quán)限,vip權(quán)限等等來攻擊你的網(wǎng)站讓你的網(wǎng)站承受損失。
代碼示例
const internal = {
foo: {
bar: null
}
}
const acceptUserInput = (type, subtype, value) => {
internal[type][subtype] = value
}
// 假設(shè)一個object
// object在代碼運(yùn)行時被創(chuàng)建
// 假設(shè)數(shù)據(jù)的獲取來自數(shù)據(jù)庫
const getRoles = () => ({ canAccessThat: true })
const userCanAccessThis = () => {
const me = getCurrentUser() // 從會話等中獲取
const roles = getRoles(me.id)
return roles.canAccessThis === true
}
// 惡意攻擊
acceptUserInput('__proto__', 'canAccessThis', true)
// 現(xiàn)在每一個用戶都會返回每個用戶的canAccessThis都是true
userCanAccessThis()這是一個簡單的模擬案例,可以讓我們更直觀的看到這個漏洞的威力。
怎么防止漏洞的產(chǎn)生?
- 在代碼中減少屬性訪問器的使用盡可能使用
.的方式去訪問對象的屬性 - 或者使用
Map或Set,來代替我們的對象 - 檢查對象的原型鏈,查看新創(chuàng)建對象的原型是否被惡意添加了原本不該有的屬性,或者屬性被修改
- 檢查用戶的輸入,只有防止用戶惡意輸入
- 用于
Object.create(null)創(chuàng)建沒有原型的對象
到此這篇關(guān)于JavaScript的原型存在的安全問題及解決辦法的文章就介紹到這了,更多相關(guān)JavaScript原型存在的問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
select隱藏選中值對應(yīng)的id,顯示其它id的簡單實現(xiàn)方法
下面小編就為大家?guī)硪黄猻elect隱藏選中值對應(yīng)的id,顯示其它id的簡單實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08
在Google 地圖上實現(xiàn)做的標(biāo)記相連接
這篇文章主要介紹了在Google 地圖上實現(xiàn)做的標(biāo)記相連接,需要的朋友可以參考下2015-01-01
js動態(tài)生成Html元素實現(xiàn)Post操作(createElement)
這篇文章主要介紹了js動態(tài)生成Html元素實現(xiàn)Post操作(createElement),需要的朋友可以參考下2015-09-09
Bootstrap modal使用及點(diǎn)擊外部不消失的解決方法
這篇文章主要為大家詳細(xì)介紹了Bootstrap modal使用及點(diǎn)擊外部不消失的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12
javascript實現(xiàn)動態(tài)加載CSS
最近在做自己的小框架的按需加載模塊,那么就需要做到異步動態(tài)加載css文件。仔細(xì)研究了一番,得到了如下解決方案,分享給大家。2015-01-01

