Ответ 1
Поскольку JSON.parse()
не запускает какой-либо код в данных для анализа, он не уязвим, как eval()
, но есть еще вещи, которые вы должны сделать для защиты целостности вашего сервера и приложения, такие как:
- Примените обработчики исключений в соответствующем месте, так как
JSON.parse()
можетJSON.parse()
исключение. - Не делайте предположений о том, какие данные есть, вы должны явно проверить данные перед их использованием.
- Только свойства процесса, которые вы специально ищете (избегая других вещей, которые могут быть в JSON).
- Проверяйте все входящие данные как допустимые, допустимые значения.
- Очистить длину данных (чтобы предотвратить проблемы DOS с чрезмерно большими данными).
- Не помещайте эти входящие данные в места, где их можно было бы дополнительно оценить, например, непосредственно в HTML-код страницы или ввести непосредственно в операторы SQL без дальнейшей очистки, чтобы убедиться, что они безопасны для этой среды.
Таким образом, чтобы ответить на ваш вопрос напрямую, "да" - это больше, чем просто использование body-parser, хотя это прекрасная линия фронта для первой обработки данных. Следующие шаги в отношении того, что вы делаете с данными после их получения от 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;
}
}