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)限是允許”
,這就給了不懷好意的壞人,一個可乘之機。
const obj = {} console.debug(obj.polluted) // '你好我是黑客,權(quán)限是允許'
為什么會不安全呢?
如果在客戶端上,這可能問題不大,如果這是在服務(wù)器上,那就可能會為黑客攻擊提供漏洞。
假設(shè)黑客知道你的代碼在運行時會創(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在代碼運行時被創(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)文章
webpack 如何同時輸出壓縮和未壓縮的文件的實現(xiàn)步驟
這篇文章主要介紹了webpack 如何同時輸出壓縮和未壓縮的文件的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06