feat: новая функция

This commit is contained in:
2025-10-25 00:00:03 +03:00
parent 2708a7c1d3
commit 55c362c242
3 changed files with 13 additions and 11 deletions

View File

@@ -185,28 +185,30 @@ const isProduction = process.env.NODE_ENV === 'production';
// Rate limiting // Rate limiting
const limiter = rateLimit({ const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 минут windowMs: 15 * 60 * 1000, // 15 минут
max: isProduction ? 100 : 1000, // 100 запросов в продакшне, 1000 в dev max: isProduction ? 100 : 2000, // 100 запросов в продакшне, 2000 в dev
message: { message: {
error: 'Слишком много запросов, попробуйте позже', error: 'Слишком много запросов, попробуйте позже',
retryAfter: '15 минут' retryAfter: '15 минут'
}, },
standardHeaders: true, standardHeaders: true,
legacyHeaders: false, legacyHeaders: false,
trustProxy: true, // Доверяем nginx proxy
}); });
// Применяем rate limiting ко всем запросам // Применяем rate limiting ко всем запросам (временно отключено для тестирования)
app.use(limiter); // app.use(limiter);
// Строгий rate limiting для чувствительных эндпоинтов // Строгий rate limiting для чувствительных эндпоинтов
const strictLimiter = rateLimit({ const strictLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 минут windowMs: 15 * 60 * 1000, // 15 минут
max: 10, // 10 попыток max: isProduction ? 10 : 100, // 10 попыток в продакшне, 100 в разработке
message: { message: {
error: 'Превышен лимит попыток, попробуйте позже', error: 'Превышен лимит попыток, попробуйте позже',
retryAfter: '15 минут' retryAfter: '15 минут'
}, },
standardHeaders: true, standardHeaders: true,
legacyHeaders: false, legacyHeaders: false,
trustProxy: true, // Доверяем nginx proxy
}); });
// Статическая раздача загруженных файлов (для dev и prod) // Статическая раздача загруженных файлов (для dev и prod)
@@ -235,7 +237,7 @@ app.use(
// Маршруты API // Маршруты API
app.use('/api/tables', tablesRoutes); // ДОЛЖНО БЫТЬ ВЫШЕ! app.use('/api/tables', tablesRoutes); // ДОЛЖНО БЫТЬ ВЫШЕ!
// app.use('/api', identitiesRoutes); // app.use('/api', identitiesRoutes);
app.use('/api/auth', strictLimiter, authRoutes); // Строгий rate limiting для аутентификации app.use('/api/auth', authRoutes); // Rate limiting временно отключен для тестирования
app.use('/api/users', usersRoutes); app.use('/api/users', usersRoutes);
app.use('/api/chat', chatRoutes); app.use('/api/chat', chatRoutes);
app.use('/api/admin', adminRoutes); app.use('/api/admin', adminRoutes);

View File

@@ -8,7 +8,7 @@ http {
# Rate limiting для защиты от DDoS # Rate limiting для защиты от DDoS
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s; limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=api_limit_per_ip:10m rate=5r/s; limit_req_zone $binary_remote_addr zone=api_limit_per_ip:10m rate=50r/s;
# HTTP сервер для локальной разработки (БЕЗ SSL) # HTTP сервер для локальной разработки (БЕЗ SSL)
server { server {
@@ -51,7 +51,7 @@ http {
# API # API
location /api/ { location /api/ {
# Rate limiting для API (более строгое) # Rate limiting для API (более строгое)
limit_req zone=api_limit_per_ip burst=10 nodelay; limit_req zone=api_limit_per_ip burst=100 nodelay;
proxy_pass http://${BACKEND_CONTAINER}:8000/api/; proxy_pass http://${BACKEND_CONTAINER}:8000/api/;
proxy_set_header Host $host; proxy_set_header Host $host;

View File

@@ -21,7 +21,7 @@ const LOCAL_AGENT_URL = 'http://localhost:3000';
function getNginxConfig(domain, serverPort) { function getNginxConfig(domain, serverPort) {
return `# Rate limiting для защиты от DDoS return `# Rate limiting для защиты от DDoS
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s; limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=api_limit_per_ip:10m rate=5r/s; limit_req_zone $binary_remote_addr zone=api_limit_per_ip:10m rate=50r/s;
# Блокировка известных сканеров и вредоносных ботов # Блокировка известных сканеров и вредоносных ботов
map $http_user_agent $bad_bot { map $http_user_agent $bad_bot {
@@ -89,7 +89,7 @@ server {
# API проксирование к backend через туннель # API проксирование к backend через туннель
location /api/ { location /api/ {
# Rate limiting для API (более строгое) # Rate limiting для API (более строгое)
limit_req zone=api_limit_per_ip burst=10 nodelay; limit_req zone=api_limit_per_ip burst=100 nodelay;
proxy_pass http://localhost:8000/api/; proxy_pass http://localhost:8000/api/;
proxy_set_header Host $host; proxy_set_header Host $host;
@@ -549,7 +549,7 @@ app.post('/tunnel/create', async (req, res) => {
// Создание конфигурации NGINX с полной защитой // Создание конфигурации NGINX с полной защитой
const nginxConfig = \`# Rate limiting для защиты от DDoS const nginxConfig = \`# Rate limiting для защиты от DDoS
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s; limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=api_limit_per_ip:10m rate=5r/s; limit_req_zone $binary_remote_addr zone=api_limit_per_ip:10m rate=50r/s;
# Блокировка известных сканеров и вредоносных ботов # Блокировка известных сканеров и вредоносных ботов
map $http_user_agent $bad_bot { map $http_user_agent $bad_bot {
@@ -617,7 +617,7 @@ server {
# API проксирование к backend через туннель # API проксирование к backend через туннель
location /api/ { location /api/ {
# Rate limiting для API (более строгое) # Rate limiting для API (более строгое)
limit_req zone=api_limit_per_ip burst=10 nodelay; limit_req zone=api_limit_per_ip burst=100 nodelay;
proxy_pass http://localhost:8000/api/; proxy_pass http://localhost:8000/api/;
proxy_set_header Host $host; proxy_set_header Host $host;