最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript的原型存在的安全問(wèn)題及解決辦法

 更新時(shí)間:2023年08月23日 11:38:47   作者:zayyo  
JavaScript的原型很多人都知道也很好用,但是很多人在使用原型繼承中導(dǎo)致的安全問(wèn)題卻很少人知道,接下來(lái)我們就來(lái)好好了解一下,感興趣的小伙伴跟著小編一起來(lái)看看吧

JavaScript的原型很多人都知道也很好用,但是很多人在使用原型繼承中導(dǎo)致的安全問(wèn)題卻很少人知道,接下來(lái)我們就來(lái)好好了解一下。

在真實(shí)開(kāi)發(fā)中,我們經(jīng)常會(huì)在代碼中使用Property accessors 屬性訪問(wèn)器,并且使用用戶輸入的參數(shù)去訪問(wèn)某個(gè)對(duì)象的屬性。這看起來(lái)可能是一個(gè)很稀疏平常的操作,但是往往在這個(gè)過(guò)程中我們的代碼就已經(jīng)產(chǎn)生了一個(gè)很大的安全漏洞!??!

為什么這樣寫(xiě)代碼會(huì)產(chǎn)生安全問(wèn)題?

我們可以看來(lái)一下,下面的一個(gè)示例

我們的訪問(wèn)代碼

const internal = {
  foo: {
    bar: null
  }
}
const acceptUserInput = (type, subtype, value) => {
  internal[type][subtype] = value
}

應(yīng)用:

// 正常的訪問(wèn)
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èn)題不大,如果這是在服務(wù)器上,那就可能會(huì)為黑客攻擊提供漏洞。

假設(shè)黑客知道你的代碼在運(yùn)行時(shí)會(huì)創(chuàng)建一個(gè)新對(duì)象,并且你沒(méi)有使用Object.create(null)創(chuàng)建一個(gè)沒(méi)有原型的對(duì)象。

黑客通過(guò)在原型上添加屬性,他們可以解鎖更多用戶權(quán)限,比如網(wǎng)站修改權(quán)限,vip權(quán)限等等來(lái)攻擊你的網(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ù)的獲取來(lái)自數(shù)據(jù)庫(kù)
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è)簡(jiǎn)單的模擬案例,可以讓我們更直觀的看到這個(gè)漏洞的威力。

怎么防止漏洞的產(chǎn)生?

  • 在代碼中減少屬性訪問(wèn)器的使用盡可能使用.的方式去訪問(wèn)對(duì)象的屬性
  • 或者使用 MapSet,來(lái)代替我們的對(duì)象
  • 檢查對(duì)象的原型鏈,查看新創(chuàng)建對(duì)象的原型是否被惡意添加了原本不該有的屬性,或者屬性被修改
  • 檢查用戶的輸入,只有防止用戶惡意輸入
  • 用于Object.create(null)創(chuàng)建沒(méi)有原型的對(duì)象

到此這篇關(guān)于JavaScript的原型存在的安全問(wèn)題及解決辦法的文章就介紹到這了,更多相關(guān)JavaScript原型存在的問(wèn)題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

乐陵市| 友谊县| 库尔勒市| 陇川县| 宝应县| 普兰店市| 明水县| 乐亭县| 乌鲁木齐县| 普宁市| 玉门市| 纳雍县| 长沙市| 荥阳市| 柳州市| 宣汉县| 周宁县| 成武县| 辽阳市| 昌吉市| 当阳市| 杭州市| 陇南市| 兴文县| 林西县| 沅陵县| 天津市| 贵溪市| 砚山县| 右玉县| 醴陵市| 隆德县| 珠海市| 仁布县| 正蓝旗| 鹰潭市| 浦北县| 沙田区| 曲周县| 苏州市| 柘荣县|