由於JSON.parse()
不運行任何代碼值對在對數據進行分析,所以它是不容易的方式eval()
是,竟然還有件事情你應該做些什麼來保護您的服務器和應用程序的完整性,如:
- 應用異常處理程序因爲
JSON.parse()
可能會引發異常。
- 不要對有什麼數據做出假設,你必須在使用數據之前明確地測試數據。
- 僅處理您正在查找的屬性(避免可能存在於JSON中的其他內容)。
- 驗證所有傳入數據爲合法的可接受值。
- 淨化數據的長度(以防止數據過大的DOS問題)。
- 不要將這些傳入的數據放入可以進一步評估的位置,例如直接放入頁面的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;
}
}
這聽起來對我來說,像body-parser已經在消毒輸入,所以你不應該自己這樣做。另一方面,除非它是性能瓶頸,否則對輸入進行雙重消毒沒有任何壞處。 – 2014-09-22 21:08:59