Нужно ли санировать JSON?

Я думаю, что это хорошо известная лучшая практика в Интернете, чтобы не доверять любой информации. Приговор

"Весь вклад злой".

это, вероятно, самая цитируемая цитата в отношении проверки ввода. Теперь для HTML вы можете использовать такие инструменты, как DOMPurify, чтобы очистить его.

У меня вопрос: если у меня есть сервер Node.js, на котором выполняется Express и промежуточное программное обеспечение для анализатора тела для получения и анализа JSON, нужно ли мне также выполнять какие-либо операции очистки?

Мои (возможно, наивные?) Мысли по этому поводу состоят в том, что JSON - это только данные, а не код, и если кто-то отправит недопустимый JSON, body-parser (который использует JSON.parse() внутреннего использования) все равно потерпит неудачу, поэтому я знаю, что мое приложение будет получить действительный объект JavaScript. Пока я не запускаю eval и не вызываю функцию, у меня все будет хорошо, не так ли?

Я что-то пропустил?

Ответ 1

Поскольку JSON.parse() не запускает какой-либо код в данных для анализа, он не уязвим, как eval(), но есть еще вещи, которые вы должны сделать для защиты целостности вашего сервера и приложения, такие как:

  1. Примените обработчики исключений в соответствующем месте, так как JSON.parse() может JSON.parse() исключение.
  2. Не делайте предположений о том, какие данные есть, вы должны явно проверить данные перед их использованием.
  3. Только свойства процесса, которые вы специально ищете (избегая других вещей, которые могут быть в JSON).
  4. Проверяйте все входящие данные как допустимые, допустимые значения.
  5. Очистить длину данных (чтобы предотвратить проблемы DOS с чрезмерно большими данными).
  6. Не помещайте эти входящие данные в места, где их можно было бы дополнительно оценить, например, непосредственно в 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;
    }
}

Ответ 2

Вы должны быть в порядке. Ранние пользователи JSON часто вызывают eval() на полученной строке, что, конечно же, является огромной дырой в безопасности. Но JSON.parse, как вы заявляете, обрабатывает большинство таких проверок здравомыслия.

Пока вы не забираете что-то из полученного объекта JSON и передаете его непосредственно в sql-запрос, например, вы должны быть в порядке.

Ответ 3

Пока вы используете JSON.parse, код не будет оцениваться

Вы должны по-прежнему использовать белый список любых пар символов: пары, которые вы хотите принять из проанализированного результата, хотя