JavaScript的原型存在的安全問題及解決辦法
JavaScript的原型很多人都知道也很好用,但是很多人在使用原型繼承中導(dǎo)致的安全問題卻很少人知道,接下來我們就來好好了解一下。
在真實(shí)開發(fā)中,我們經(jīng)常會(huì)在代碼中使用Property accessors 屬性訪問器,并且使用用戶輸入的參數(shù)去訪問某個(gè)對(duì)象的屬性。這看起來可能是一個(gè)很稀疏平常的操作,但是往往在這個(gè)過程中我們的代碼就已經(jīng)產(chǎn)生了一個(gè)很大的安全漏洞?。?!
為什么這樣寫代碼會(huì)產(chǎn)生安全問題?
我們可以看來一下,下面的一個(gè)示例
我們的訪問代碼
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)限是允許')在我們的惡意攻擊中,我們向我們的原型上添加了一個(gè)polluted屬性。導(dǎo)致我們所有新創(chuàng)建的對(duì)象都會(huì)多出一個(gè)polluted屬性,屬性的值是“你好我是黑客,權(quán)限是允許”,這就給了不懷好意的壞人,一個(gè)可乘之機(jī)。
const obj = {}
console.debug(obj.polluted) // '你好我是黑客,權(quán)限是允許'為什么會(huì)不安全呢?
如果在客戶端上,這可能問題不大,如果這是在服務(wù)器上,那就可能會(huì)為黑客攻擊提供漏洞。
假設(shè)黑客知道你的代碼在運(yùn)行時(shí)會(huì)創(chuàng)建一個(gè)新對(duì)象,并且你沒有使用Object.create(null)創(chuàng)建一個(gè)沒有原型的對(duì)象。
黑客通過在原型上添加屬性,他們可以解鎖更多用戶權(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è)一個(gè)object
// object在代碼運(yùn)行時(shí)被創(chuàng)建
// 假設(shè)數(shù)據(jù)的獲取來自數(shù)據(jù)庫
const getRoles = () => ({ canAccessThat: true })
const userCanAccessThis = () => {
const me = getCurrentUser() // 從會(huì)話等中獲取
const roles = getRoles(me.id)
return roles.canAccessThis === true
}
// 惡意攻擊
acceptUserInput('__proto__', 'canAccessThis', true)
// 現(xiàn)在每一個(gè)用戶都會(huì)返回每個(gè)用戶的canAccessThis都是true
userCanAccessThis()這是一個(gè)簡單的模擬案例,可以讓我們更直觀的看到這個(gè)漏洞的威力。
怎么防止漏洞的產(chǎn)生?
- 在代碼中減少屬性訪問器的使用盡可能使用
.的方式去訪問對(duì)象的屬性 - 或者使用
Map或Set,來代替我們的對(duì)象 - 檢查對(duì)象的原型鏈,查看新創(chuàng)建對(duì)象的原型是否被惡意添加了原本不該有的屬性,或者屬性被修改
- 檢查用戶的輸入,只有防止用戶惡意輸入
- 用于
Object.create(null)創(chuàng)建沒有原型的對(duì)象
到此這篇關(guān)于JavaScript的原型存在的安全問題及解決辦法的文章就介紹到這了,更多相關(guān)JavaScript原型存在的問題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
webpack 如何同時(shí)輸出壓縮和未壓縮的文件的實(shí)現(xiàn)步驟
這篇文章主要介紹了webpack 如何同時(shí)輸出壓縮和未壓縮的文件的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06

