mirror of
				https://github.com/goldbergyoni/nodebestpractices.git
				synced 2025-10-31 17:47:26 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			69 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # Проверяйте входящие схемы JSON
 | ||
| 
 | ||
| ### Объяснение в один абзац
 | ||
| 
 | ||
| Проверка заключается в том, чтобы очень четко определить, какую полезную нагрузку готово принять ваше приложение, и быстро провалиться, если входные данные отклоняются от ожиданий. Это минимизирует область действия атакующего, который больше не может испытывать полезные нагрузки с другой структурой, значениями и длиной. Практически это предотвращает такие атаки, как DDOS (код вряд ли потерпит неудачу, когда ввод правильно определен) и небезопасная десериализация (JSON не содержит сюрпризов). Хотя валидация может быть закодирована или основана на классах и типах (классы TypeScript, ES6), сообществу все больше нравятся схемы на основе JSON, поскольку они позволяют объявлять сложные правила без кодирования и делить ожидания с внешним интерфейсом. JSON-схема - это новый стандарт, который поддерживается многими библиотеками и инструментами npm (например, [jsonschema](https://www.npmjs.com/package/jsonschema), [Postman](http://blog.getpostman.com/2017/07/28/api-testing-tips-from-a-postman-professional/)), [joi](https://www.npmjs.com/package/joi) также очень популярны среди приятного синтаксиса. Как правило, синтаксис JSON не может охватить весь сценарий проверки, и полезный пользовательский код или предварительно запеченные платформы проверки, такие как [validator.js](https://github.com/chriso/validator.js/). Независимо от выбранного синтаксиса, убедитесь, что проверка запущена как можно раньше - например, с помощью промежуточного программного обеспечения Express, которое проверяет тело запроса до его передачи обработчику маршрута.
 | ||
| 
 | ||
| ### Пример - правила проверки JSON-схемы
 | ||
| 
 | ||
| ```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-схемы
 | ||
| 
 | ||
| ```javascript
 | ||
| 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
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| ```
 | ||
| 
 | ||
| ### Пример - использование средства проверки промежуточного программного обеспечения
 | ||
| 
 | ||
| ```javascript
 | ||
| // 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](https://nemethgergely.com/blog/nodejs-security-overview):
 | ||
| > Проверка правильности ввода данных пользователем является одной из самых важных вещей, которые необходимо предпринять, когда речь заходит о безопасности вашего приложения. Неспособность сделать это правильно может открыть ваше приложение и пользователей для широкого спектра атак, включая внедрение команд, внедрение SQL или хранимые межсайтовые сценарии.<br/>
 | ||
| 
 | ||
| Для проверки ввода пользователя одна из лучших библиотек, которую вы можете выбрать, - это joi. Joi - это язык описания схемы объектов и валидатор для объектов JavaScript.
 | 
