Skip to main content

Ограничивайте размер полезной нагрузки с помощью обратного прокси или промежуточного ПО

Объяснение в один абзац

Разбор тел запросов, например JSON-кодированных полезных нагрузок, является операцией с высокой производительностью, особенно с большими запросами. При обработке входящих запросов в вашем веб-приложении вы должны ограничить размер их соответствующих полезных нагрузок. Поступающие запросы с неограниченными размерами тела/полезной нагрузки могут привести к плохой работе приложения или к его сбоям из-за сбоя в отказе в обслуживании или других нежелательных побочных эффектов. Многие популярные middleware-решения для синтаксического анализа тел запросов, такие как уже включенный пакет body-parser для express, предоставляют опции для ограничения размеров полезных нагрузок запросов, облегчая разработчикам реализацию этой функциональности. Вы также можете интегрировать ограничение размера тела запроса в программное обеспечение обратного прокси-сервера/веб-сервера, если оно поддерживается. Ниже приведены примеры ограничения размеров запросов с использованием express и/или nginx.

Пример кода для express

const express = require('express');

const app = express();

app.use(express.json({ limit: '300kb' })); // body-parser defaults to a body size limit of 100kb

// Request with json body
app.post('/json', (req, res) => {

// Check if request payload content-type matches json, because body-parser does not check for content types
if (!req.is('json')) {
return res.sendStatus(415); // -> Unsupported media type if request doesn't have JSON body
}

res.send('Hooray, it worked!');
});

app.listen(3000, () => console.log('Example app listening on port 3000!'));

🔗 Express docs for express.json()

Пример конфигурации для nginx

http {
...
# Limit the body size for ALL incoming requests to 1 MB
client_max_body_size 1m;
}

server {
...
# Limit the body size for incoming requests to this specific server block to 1 MB
client_max_body_size 1m;
}

location /upload {
...
# Limit the body size for incoming requests to this route to 1 MB
client_max_body_size 1m;
}

🔗 Nginx docs for client_max_body_size