探索lodash的一個安全漏洞

原文連接git

近期打算準備重構我17年寫的博客項目,打開項目看到了下圖的一條安全漏洞的提示。github

lodash-1 lodash-2

使用 lodash 這麼多年,竟然有高危漏洞,好奇心驅使我繼續探索。npm

探索過程

What

在項目下執行:安全

- npm audit
複製代碼
lodash-3

圖中網站地址: www.npmjs.com/advisories/…]bash

lodash-4

圖中 HackerOneReport 地址:hackerone.com/reports/310…函數

原來是原型污染。npm 網站上已經描述的很清楚了,是 'defaultsDeep'、'merge'、 'mergeWith' 三個函數在使用中可能會形成原型污染。網站

Why

嘗試一把:spa

lodash-5 lodash-6

使用 ES6 assign 實現:prototype

lodash-7

果真是有問題的。3d

How

相關補丁 commit: github.com/lodash/loda…

核心代碼:

lodash-8

結論: 實現了一個 safeGet 的函數來避免獲取原型上的值。

相關知識點

最佳實踐

  • 儘可能避免使用 for...in... 遍歷對象

  • 遍歷對象時先使用 Object.keys() 獲取對象的全部 key,再進行遍歷

  • 不要直接將一個未知變量做爲對象的 key 使用

  • 在讀取一個對象未知屬性時,必定要使用 hasOwnProperty 判斷以後再去讀取

相關文章
相關標籤/搜索