2014-09-22 109 views
10

我認爲這是網絡上一個衆所周知的最佳做法,不信任任何輸入。句子是否需要對JSON進行消毒?

「所有輸入都是邪惡的。」

可能是輸入驗證方面引用最多的引用。現在,對於HTML,您可以使用諸如DOMPurify等工具對其進行消毒。

我的問題是,如果我有一個運行Express的Node.js服務器和body-parser中間件來接收和解析JSON,我是否還需要運行任何清理?我的(也許天真?)的想法是,JSON只是數據,沒有代碼,如果有人發送無效的JSON,body-parser(內部使用JSON.parse())會失敗,所以我知道我的應用程序將接收有效的JavaScript對象。只要我不運行eval或調用一個函數,我應該沒問題,不是嗎?

我錯過了什麼嗎?

+2

這聽起來對我來說,像body-parser已經在消毒輸入,所以你不應該自己這樣做。另一方面,除非它是性能瓶頸,否則對輸入進行雙重消毒沒有任何壞處。 – 2014-09-22 21:08:59

回答

14

由於JSON.parse()不運行任何代碼值對在對數據進行分析,所以它是不容易的方式eval()是,竟然還有件事情你應該做些什麼來保護您的服務器和應用程序的完整性,如:

  1. 應用異常處理程序因爲JSON.parse()可能會引發異常。
  2. 不要對有什麼數據做出假設,你必須在使用數據之前明確地測試數據。
  3. 僅處理您正在查找的屬性(避免可能存在於JSON中的其他內容)。
  4. 驗證所有傳入數據爲合法的可接受值。
  5. 淨化數據的長度(以防止數據過大的DOS問題)。
  6. 不要將這些傳入的數據放入可以進一步評估的位置,例如直接放入頁面的HTML中,或直接注入SQL語句中而不進行進一步的清理以確保其對於該環境是安全的。

因此,要直接回答您的問題,「是」還有更多的工作要做,而不僅僅是使用body-parser,儘管它是第一個處理數據的完美的前線。在從身體分析器得到數據後,對數據所做的下一步操作在很多情況下都很重要,並且可能需要額外的注意。


舉個例子,這裏有一個解析函數,期望一個對象具有屬性適用部分檢查,併爲您過濾結果只包含您所期望的特性:

// pass expected list of properties and optional maxLen 
// returns obj or null 
function safeJSONParse(str, propArray, maxLen) { 
    var parsedObj, safeObj = {}; 
    try { 
     if (maxLen && str.length > maxLen) { 
      return null; 
     } else { 
      parsedObj = JSON.parse(str); 
      if (typeof parsedObj !== "object" || Array.isArray(parsedObj)) { 
       safeObj = parseObj; 
      } else { 
       // copy only expected properties to the safeObj 
       propArray.forEach(function(prop) { 
        if (parsedObj.hasOwnProperty(prop)) { 
         safeObj[prop] = parseObj[prop]; 
        } 
       }); 
      } 
      return safeObj; 
     } 
    } catch(e) { 
     return null; 
    } 
} 
4

你應該沒問題。早期的JSON用戶通常會在收到的字符串上調用eval(),這當然是一個巨大的安全漏洞。但是,正如你所說,JSON.parse處理了大多數這種完整性檢查。例如,你應該沒問題,只要你確保不會從收到的JSON對象中拿出某些東西並將它直接傳遞給sql查詢。

+2

提示:如果不將某些內容從接收的JSON直接傳遞到SQL查詢中,這一點特別有價值,謝謝你:-)! – 2014-09-22 21:17:06

2

只要你使用JSON.parse沒有代碼進行評估

你還是應該列入白名單的任意鍵:你想從分析結果接受雖然

+4

'JSON.parse'的某些填充(如Crockford的[json2.js](https://github.com/douglascrockford/JSON-js/blob/master/json2.js))使用'eval'。 – Oriol 2014-09-22 21:26:02

+3

感謝您的提及,但解決方案很簡單:不要使用它。 – naomik 2014-09-22 21:27:54

+3

@Oriol - 此外,這個問題特別是關於在node.js中使用實際的'JSON.parse()'的代碼。這裏沒有涉及polyfill。 – jfriend00 2014-09-22 21:31:12

相關問題