亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在使用 JSON.parse 之前應該如何清理不受信任的 JSON?

在使用 JSON.parse 之前應該如何清理不受信任的 JSON?

尚方寶劍之說 2023-03-10 14:54:34
給定一個用戶提供的 JSON 字符串,我們如何在運行之前JSON.parse(untrustedString)對其進行清理?我主要擔心的是原型污染,但我也想知道我還應該注意什么?如果只是原型污染有風險,那么我認為可以通過正則表達式處理,但我懷疑還有其他問題?例如,這篇關于解析不受信任的 JSON 然后創建對象副本的危險的文章。:現在考慮發送到此端點的一些惡意 JSON 數據。{  "user": {    "__proto__": {      "admin": true    }  }} 如果發送此 JSON,JSON.parse將生成一個具有屬性的對象 __proto__。如果復制庫按上述方式工作,它將把 admin 屬性復制到 req.session.user!
查看完整描述

2 回答

?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

我主要擔心的是原型污染

注意JSON.parse不會污染任何原型對象。如果 JSON 字符串有一個"__proto__"鍵,那么該鍵將像任何其他鍵一樣被創建,無論該 JSON 中對應的值是什么,它最終都會作為該屬性值,而不是在原型對象 () 中Object.prototype。

風險在于您之后對該對象所做的操作。如果您執行(深)復制,使用屬性分配 或Object.assign,那么您可能會改變原型對象。

我們如何在運行前對其進行消毒JSON.parse(untrustedString)?...我認為可以通過正則表達式處理

不要為此使用正則表達式。使用 的第二個參數JSON.parse

const cleaner = (key, value) => key === "__proto__" ? undefined : value;


// demo

let json = '{"user":{"__proto__":{"admin": true}}}';


console.log(JSON.parse(json));

console.log(JSON.parse(json, cleaner));


查看完整回答
反對 回復 2023-03-10
?
慕田峪9158850

TA貢獻1794條經驗 獲得超7個贊

在你對它做任何事情之前,userString它只是一個字符串,并且該字符串中的任何內容本身都不會損害系統,除非系統做一些事情來允許這種損害,比如以不安全的方式處理它。

輸入JSON.parse()

JSON.parse()只是一個格式轉換工具。它不會從數據中運行任何方法(原型污染利用依賴于它),或者實際上什至查看包含在字符串化對象本身中的數據,除了它包含的結構語法和 JavaScript 保留字,用于驗證目的(MDN polyfill例子)。與字符串相同的原則適用于此;如果您不對輸出對象做任何不安全的事情,它就不會傷害您或您的系統。

歸根結底,防止濫用歸結為驗證安全數據處理實踐

您鏈接的文章中,作者提到了這個確切的想法:

...來自用戶的數據應始終進行過濾和清理。


查看完整回答
反對 回復 2023-03-10
  • 2 回答
  • 0 關注
  • 188 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號