為什麼 JSON.stringify 並不像看起來那麼無害
開發者每天都會使用 JSON.stringify 來序列化數據,透過網路傳輸物件、將狀態儲存在檔案中或持久化配置。但是,這種看似無害的 JSON.stringify 調用,如果之後未經驗證就將資料重新序列化,則可能導致不安全的反序列化。
問題不在於 JSON.stringify 本身,而是我們如何誤用它。當你序列化複雜物件(尤其是包含原型或類別實例的物件)後,又盲目地使用 stringify 進行反序列化時,就會出現問題。 JSON 解析否則,你就有可能在應用程式中引入惡意負載。
在 JavaScript 中,很容易想當然地認為序列化的內容是安全的,因為它「只是」。 JSON但JSON是數據,不是邏輯。如果攻擊者控制了這些數據,他們就可以利用程式碼中的信任邊界漏洞。這就是不安全反序列化的開始。
導致反序列化不安全的常見開發者錯誤
不安全的反序列化通常源自於一些在程式碼審查中看似無害的習慣。但是,當 JSON.stringify 使用不當時, 攻擊面擴大.
不安全的做法:序列化未經驗證的使用者輸入
🇧🇷警告: 這種模式會在沒有任何驗證的情況下序列化攻擊者控制的輸入。如果之後資料被信任,則可能導致不安全的反序列化。
🇧🇷警告: 未經驗證就反序列化相同的資料可能會將有效負載重新引入您的應用程式中。
危險模式:跨信任邊界重複使用 JSON
在一個服務(開發環境)中建立的序列化 JSON 未經驗證就被另一個服務(生產環境)重複使用。這種情況經常發生在內部工具或微服務中。
Python 中隱性風險的範例:
🇧🇷警告: 以下的序列化和反序列化步驟都會處理可能不受信任的數據,而無需進行驗證。
這兩個範例都對使用者控制的資料進行序列化和反序列化,而沒有強制執行模式。這為不安全的反序列化攻擊提供了溫床,這些攻擊可能因不謹慎使用 JSON.stringify 而觸發。
真實風險 Pipelines:從程式碼到 CI/CD 反序列化流程
現在把這種行為理解為 pipeline. 當 JSON.stringify 在內部被濫用時 CI/CD 在工作流程中,您的建置流程會面臨不安全的反序列化風險。這種情況經常發生在工件元資料、測試裝置和配置快照上。
共同 CI/CD 陷阱:
- 不安全的工件生成:建構工件包含序列化對象,這些物件在未經驗證的情況下跨作業重複使用。
- 序列化環境變數:團隊將環境變數儲存為序列化的 JSON,並在步驟甚至專案中重複使用它們。
- 注入的測試數據:來自不受信任來源的反序列化測試數據 commits 或分支執行時未進行類型檢查。
這些模式使得攻擊者能夠輕鬆地將惡意負載注入到受信任的系統中。 pipeline使用經過處理的 JSON 字串化邏輯。
🇧🇷警告:此工作流程會未經驗證就傳遞序列化資料。如果 test-runner.js 不驗證輸入,則有反序列化不安全的風險。
If 測試運行器.js 載入和解析 JSON 時不進行驗證,可能會觸發不安全的反序列化。
使用驗證和安全解析功能保護 JSON。 stringify
解決方法並非完全避免使用 JSON.stringify,而是謹慎使用並一致地進行安全檢查。如果處理得當,它是安全的,但在現代技術中,它可能會帶來一些問題。 pipeline假設很快就會被打破。
DevSecOps 實踐以確保安全 JSON.stringify:
- 使用 JSON 模式驗證序列化和反序列化資料。
- 強制執行嚴格的類型定義,避免使用鴨子類型或物件形狀的假設。
- 使用支援模式強制執行或類型保護的安全解析函式庫。
- 即使序列化資料來自可信任儲存庫,也應將其視為不可信資料。
- 儀器 pipeline儘早發現有風險的 JSON.stringify 模式。
最佳實務:本範例使用 JSON 模式驗證來防止不安全的反序列化。範例使用 jv 在 Node.js 中:
安全反序列化意味著驗證 之前 不要盲目信任 JSON。 stringify 的預設設定是為了確保安全;你需要定義什麼是安全的。
使用 Xygeni 檢測序列化風險
人工審核只能發現一部分問題。 Xygeni 它可以讓你清楚地了解 JSON.stringify 在你的程式碼庫中的使用情況,並且 pipelines.
Xygeni 的功能:
- 痕跡 JSON.stringify 從原始碼到部署的使用。
- 偵測不安全的反序列化流程,尤其是在微服務之間; pipeline 階段。
- 標記對環境變數、使用者輸入或工件等不安全資料的序列化。
- 針對模式偏差發出警報,顯示序列化資料何時改變形狀或跨越信任邊界。
這種可見性對於處理 JSON.stringify 引入的不安全反序列化風險至關重要,尤其是在… CI/CD 序列化資料快速、安靜傳輸的系統。
保護 JSON。 stringify:您的 Shield 防止不安全的反序列化
JSON.stringify 本身並不危險。但如果使用不當,它就會成為不安全反序列化的入口。
如果您是使用 JSON 的開發人員:
- 審核您在各項服務中的使用情況, pipeline以及工具。
- 將反序列化資料視為不可信資料。
- 應用模式驗證、強制類型,並將安全性整合到您的系統中。 CI/CD.
而且不要止步於最佳實踐,使用 Xygeni 來追蹤、檢測和阻止不安全的反序列化風險,防止它們進入生產環境。 序列化並非中立的。請謹慎使用。 JSON.字串化 安全。





