」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 防止 JavaScript 中原型污染攻擊的步驟

防止 JavaScript 中原型污染攻擊的步驟

發佈於2024-07-31
瀏覽:875

Steps to Preventing Prototype Pollution Attacks in JavaScript

在網路安全領域,原型污染是一種微妙但具有潛在破壞性的漏洞,如果處理不當,可能會導致嚴重後果。在這篇部落格中,我們將探討什麼是原型污染、它是如何發生的,以及最重要的是,如何預防它。讓我們開始吧!

什麼是原型污染?

原型污染是影響 JavaScript 應用程式的漏洞。當攻擊者能夠將屬性注入物件的原型時,就會發生這種情況,然後原型可以傳播到從此原型繼承的所有物件。這可能會導致意外行為,包括覆蓋現有方法和屬性的能力,最終損害應用程式的安全性和功能。

原型污染是如何發生的

為了了解原型污染是如何發生的,我們需要仔細研究 JavaScript 物件和原型。在 JavaScript 中,每個物件都有一個原型,它是另一個對象,第一個物件從該物件繼承屬性和方法。這種原型鏈允許高效的屬性查找,但如果處理不當,也會為潛在的攻擊打開大門。

這是原型污染如何發生的一個簡單例子:

let obj = {};
console.log(obj.constructor); // function Object() { [native code] }

obj.__proto__.polluted = true;
console.log({}.polluted); // true

在這個例子中,透過修改obj的proto屬性,我們無意中影響了共享相同原型的所有對象,展示了污染原型鍊是多麼容易。

原型污染的現實範例

考慮這樣一個場景:使用者輸入用於擴展或合併物件而無需進行適當的驗證。一個常見的用例是將查詢參數合併到配置物件中。

const merge = require('lodash/merge');

let config = {};
let query = JSON.parse('{"__proto__":{"admin":true}}');

merge(config, query);

console.log(config.admin); // undefined
console.log({}.admin); // true

在此範例中,Lodash 函式庫中的合併函數用於將組態與查詢結合。但是,攻擊者控制的查詢物件包含一個 proto 屬性,該屬性會污染全域物件原型,將所有物件的 admin 設為 true。

防止原型污染

為了保護您的應用程式免受原型污染,請考慮實施以下措施:

1。避免擴展原生原型:
不要直接擴展本機原型(例如 Object.prototype),因為它可能導致衝突和安全漏洞。

範例:避免擴展原生原型
避免這樣做:

Object.prototype.polluted = true; // Extending native prototype

let obj = {};
console.log(obj.polluted); // true

相反,在您自己的命名空間中創建實用方法:

const myUtils = {
  polluted: function() {
    // Your method implementation
  }
};

let obj = {};
console.log(obj.polluted); // undefined

2.驗證使用者輸入:
在使用使用者輸入建構或修改物件之前,請始終驗證和清理使用者輸入。使用 Joi 或 Validator 等函式庫來強制執行嚴格的輸入驗證規則。

範例:使用 Joi 驗證使用者輸入

const Joi = require('joi');

const schema = Joi.object({
  admin: Joi.boolean().required()
});

const input = JSON.parse('{"admin":true}');

const { error, value } = schema.validate(input);

if (error) {
  console.error('Invalid input:', error.details);
} else {
  console.log('Valid input:', value);
}

3.使用安全物件方法:

喜歡使用不遍歷原型鏈的安全物件方法,例如 Object.create(null) 來建立沒有原型的普通物件。

範例:使用安全物件方法

let safeObj = Object.create(null);
safeObj.admin = false;

console.log(safeObj.constructor); // undefined
console.log(safeObj.admin); // false

4。凍結原型:

凍結Object.prototype以防止原型鏈被修改。這可以使用 Object.freeze().

來完成

範例:凍結原型

Object.freeze(Object.prototype);

let obj = {};
try {
  obj.__proto__.polluted = true;
} catch (e) {
  console.error('Attempt to modify prototype failed:', e);
}

console.log({}.polluted); // undefined

5。更新依賴項:

定期更新您的依賴項,以確保您使用的是包含安全性修補程式的最新版本。第三方庫中的漏洞經常被利用進行原型污染攻擊。

範例:使用 npm 更新相依性

npm update

定期執行此命令以確保所有軟體包都是最新的。

6。監控與測試:
實施監控和自動化測試以檢測和減輕原型污染漏洞。 npmaudit 等工具可以幫助識別專案中易受攻擊的套件。

範例:使用 npm 稽核進行監控與測試

npm audit

執行此命令來掃描您的專案是否有漏洞。它提供發現問題的報告並建議補救步驟。

結論

原型污染是一個嚴重的漏洞,如果不加以控制,可能會產生深遠的後果。透過了解它是如何發生的並實施最佳實踐來防止它,您可以顯著增強 JavaScript 應用程式的安全性。保持警惕,使您的依賴項保持最新,並始終驗證使用者輸入以防止這種陰險的攻擊媒介。

如果您發現此部落格有幫助,請務必與其他開發人員和安全愛好者分享。保持資訊靈通和積極主動是維護強大網路安全的關鍵。快樂編碼!

版本聲明 本文轉載於:https://dev.to/rigalpatel001/steps-to-preventing-prototype-pollution-attacks-in-javascript-118g?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 為什麼 `array_shift()` 會觸發「嚴格標準:只有變數應該透過引用傳遞」?
    為什麼 `array_shift()` 會觸發「嚴格標準:只有變數應該透過引用傳遞」?
    錯誤訊息「Strict Standards: Only Variables Should Be Passed by Reference」使用array_shift() 時,可能會報告嚴格標準如果傳遞的參數是函數呼叫的結果,則會發出警告。這種行為看起來不一致,因為它並不總是觸發警告。 考慮以下程式碼:...
    程式設計 發佈於2024-12-21
  • 如何在 Pandas 中進行聚合?
    如何在 Pandas 中進行聚合?
    Pandas 中的聚合如何使用 Pandas 執行聚合? 聚合函數會降低傳回物件的維度。一些常見的聚合函數包括mean()、sum()、size()、count()、std()、var()和sem()。 df1 = df.groupby(['A', 'B'], as_index=False)['C'...
    程式設計 發佈於2024-12-21
  • 如何在 C++ 中初始化靜態 `const std::string` 資料成員?
    如何在 C++ 中初始化靜態 `const std::string` 資料成員?
    宣告const std::string 類型的靜態資料成員在C 中,直接在類別定義中初始化const std::string 類型的靜態資料成員是不允許。相反,有兩個選項可以定義此類資料成員:內聯變數(C 17 或更高版本)使用內聯變量,它定義並初始化類別定義中的靜態成員:class A { pri...
    程式設計 發佈於2024-12-21
  • 如何在 Python 中從函數內部取得函數名稱?
    如何在 Python 中從函數內部取得函數名稱?
    從函數內部存取函數名稱在Python 中,從函數本身內部確定函數名稱在動態自省的情況下非常有用inspect 模組提供了一個方便的機制來獲取有關正在運行的程式碼的資訊。使用inspect.stack(),我們可以存取表示目前呼叫堆疊的幀列表。 對於給定的函數,堆疊列表中的第一幀對應於當前函數,而第二...
    程式設計 發佈於2024-12-21
  • 如何將電子表格列索引號轉換為其等效字母?
    如何將電子表格列索引號轉換為其等效字母?
    將電子表格列索引轉換為字母在 Google 表格中,列用數字索引,從 1 開始。但是,為了方便起見,它們通常也使用字母來表示(例如,“A”表示第一列,“D”表示第四列)。數字索引和字母值之間的轉換通常是腳本任務所必需的。 實作此轉換的一種方法是透過以下函數:function getColumnLet...
    程式設計 發佈於2024-12-21
  • 為什麼 `reader.ReadString` 不刪除初始分隔符號?
    為什麼 `reader.ReadString` 不刪除初始分隔符號?
    reader.ReadString 不會去掉初始分隔符號reader.ReadString 不會去掉初始分隔符號為了創建一個程式來迎接名為Alice 或Bob 的用戶,開發人員遇到一個問題,即使是合法的名稱也會引發不受歡迎的回應。程式錯誤地拒絕了 Alice 和 Bob 的進入。 問題此問題源自於程...
    程式設計 發佈於2024-12-21
  • 如何透過ServletContext存取WAR/WEB-INF目錄下的資源?
    如何透過ServletContext存取WAR/WEB-INF目錄下的資源?
    透過ServletContext存取WAR/WEB-INF目錄中的資源簡介: Java Web 應用程式通常將重要資源儲存在WAR/WEB-INF 目錄中。要存取這些資源,開發人員可以利用 ServletContext API。 問題:如何創建位於 WAR/WEB-INF中的資源的正確路徑資料夾,例...
    程式設計 發佈於2024-12-21
  • 如何使用 Bootstrap 隱藏響應式佈局中的元素?
    如何使用 Bootstrap 隱藏響應式佈局中的元素?
    使用Bootstrap 隱藏響應式佈局中的元素設計響應式佈局時,管理空間變得至關重要,尤其是在較小的螢幕上。 Bootstrap 為行動裝置提供了對折疊功能表列專案的支持,但是如果您想類似地隱藏其他頁面元素怎麼辦? 解決方案:解決方案:Bootstrap 提供了允許您的類別根據螢幕尺寸隱藏元素:超小...
    程式設計 發佈於2024-12-21
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-12-21
  • 如何修復嵌入式Python中的「Py_Initialize:無法載入檔案系統編解碼器」錯誤?
    如何修復嵌入式Python中的「Py_Initialize:無法載入檔案系統編解碼器」錯誤?
    解決嵌入式Python 中的「Py_Initialize:無法載入檔案系統編解碼器」錯誤嘗試將嵌入式Python 3.2 解譯器整合到對於C 應用程序,可能會出現指示“無法載入檔案系統編解碼器”的錯誤。當 Py_Initialize 函數無法註冊編解碼器搜尋函數時,會發生此錯誤。 要解決此問題,必須...
    程式設計 發佈於2024-12-21
  • JavaScript 可以捕獲網頁螢幕截圖並將其發送到伺服器嗎?
    JavaScript 可以捕獲網頁螢幕截圖並將其發送到伺服器嗎?
    使用 JavaScript 擷取網頁螢幕截圖:可能嗎? 在基於 Web 的應用程式無所不在的世界中,對網頁進行螢幕截圖已成為可能成為開發人員和使用者的重要任務。然而,問題出現了:使用 JavaScript 捕獲網頁截圖並提交回伺服器是否可行? 使用 JavaScript 進行網頁截圖的挑戰由於由於瀏...
    程式設計 發佈於2024-12-21
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段中:action=''而非:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST陣列:表單提交後使用 var_dump 檢查 $_POST 陣列的內...
    程式設計 發佈於2024-12-21
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-12-21
  • 如何使用 PHP 計算兩個日期之間的時差(以秒為單位)?
    如何使用 PHP 計算兩個日期之間的時差(以秒為單位)?
    計算兩個日期之間的時差(以秒為單位)計算兩個日期之間的時差(以秒為單位)在各種情況下都很有用。本文旨在為這項任務提供一個清晰的解決方案,解決先前 Stack Overflow 討論中面臨的挑戰。 確定兩個日期之間的時間跨度,例如“2011-05-12 18:20:20 ”和“2011-05-13 1...
    程式設計 發佈於2024-12-21
  • 插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入記錄時如何解決「一般錯誤:2006 MySQL 伺服器已消失」介紹:將資料插入MySQL 資料庫有時會導致錯誤「一般錯誤:2006 MySQL 伺服器已消失」。當與伺服器的連線遺失時會出現此錯誤,通常是由於 MySQL 配置中的兩個變數之一所致。 解決方案:解決此錯誤的關鍵是調整wait_tim...
    程式設計 發佈於2024-12-21

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3