Проверяйте входящие схемы JSON
Объяснение в один абзац
Проверка заключается в том, чтобы очень четко определить, какую полезную нагрузку готово принять ваше приложение, и быстро провалиться, если входные данные отклоняются от ожиданий. Это минимизирует область действия атакующего, который больше не может испытывать полезные нагрузки с другой структурой, значениями и длиной. Практически это предотвращает такие атаки, как DDOS (код вряд ли потерпит неудачу, когда ввод правильно определен) и небезопасная десериализация (JSON не содержит сюрпризов). Хотя валидация может быть закодирована или основана на классах и типах (классы TypeScript, ES6), сообществу все больше нравятся схемы на основе JSON, поскольку они позволяют объявлять сложные правила без кодирования и делить ожидания с внешним интерфейсом. JSON-схема - это новый стандарт, который поддерживается многими библиотеками и инструментами npm (например, jsonschema, Postman), joi также очень популярны среди приятного синтаксиса. Как правило, синтаксис JSON не может охватить весь сценарий проверки, и полезный пользовательский код или предварительно запеченные платформы проверки, такие как validator.js. Независимо от выбранного синтаксиса, убедитесь, что проверка запущена как можно раньше - например, с помощью промежуточного программного обеспечения Express, которое проверяет тело запроса до его передачи обработчику маршрута.
Пример - правила проверки JSON-схемы
{
"$schema": "http://json-schema.org/draft-06/schema#",
"title": "Product",
"description": "A product from Acme's catalog",
"type": "object",
"properties": {
"name": {
"description": "Name of the product",
"type": "string"
},
"price": {
"type": "number",
"exclusiveMinimum": 0
}
},
"required": ["id", "name", "price"]
}
Пример - проверка сущности с использованием JSON-схемы
const JSONValidator = require('jsonschema').Validator;
class Product {
validate() {
const v = new JSONValidator();
return v.validate(this, schema);
}
static get schema() {
//define JSON-Schema, see example above
}
}
Пример - использование средства проверки промежуточного программного обеспечения
// The validator is a generic middleware that gets the entity it should validate and takes care to return
// HTTP status 400 (Bad Request) should the body payload validation fail
router.post('/' , **validator(Product.validate)**, async (req, res, next) => {
// route handling code goes here
});
Что говорят другие блогеры
Из блога Gergely Nemeth:
Проверка правильности ввода данных пользователем является одной из самых важных вещей, которые необходимо предпринять, когда речь заходит о безопасности вашего приложения. Неспособность сделать это правильно может открыть ваше приложение и пользователей для широкого спектра атак, включая внедрение команд, внедрение SQL или хранимые межсайтовые сценарии.
Для проверки ввода пользователя одна из лучших библиотек, которую вы можете выбрать, - это joi. Joi - это язык описания схемы объектов и валидатор для объектов JavaScript.