refactor: шаг 2 — лимитеры вынесены в src/middleware/rateLimit.js
This commit is contained in:
@@ -2,7 +2,8 @@ const express = require('express');
|
||||
const cookieParser = require('cookie-parser');
|
||||
const path = require('path');
|
||||
const helmet = require('helmet');
|
||||
const { rateLimit } = require('express-rate-limit');
|
||||
// rateLimit.js: mutationLimiter (POST-роуты) и exportLimiter (GET /export)
|
||||
const { mutationLimiter, exportLimiter } = require('./src/middleware/rateLimit');
|
||||
const { doubleCsrf } = require('csrf-csrf');
|
||||
require('dotenv').config();
|
||||
const { checkConnection } = require('./src/db');
|
||||
@@ -23,26 +24,6 @@ app.set('views', path.join(__dirname, 'views'));
|
||||
// Referrer-Policy и пр. CSP отключён явно — EJS использует inline-стили/скрипты.
|
||||
app.use(helmet({ contentSecurityPolicy: false }));
|
||||
|
||||
// ── Rate limiting ──────────────────────────────────────────────────────────────
|
||||
// Мутирующие POST-маршруты: не более 30 запросов за 1 минуту с одного IP.
|
||||
// Это защищает от случайного flood и простых скриптовых атак.
|
||||
const mutationLimiter = rateLimit({
|
||||
windowMs: 60_000, // окно 1 минута
|
||||
limit: 30, // макс 30 POST-запросов
|
||||
standardHeaders: 'draft-7', // Retry-After в заголовках
|
||||
legacyHeaders: false,
|
||||
message: { error: 'Слишком много запросов. Подождите минуту.' },
|
||||
});
|
||||
|
||||
// /export доступен публично — ограничиваем отдельно, мягче (по IP)
|
||||
const exportLimiter = rateLimit({
|
||||
windowMs: 60_000,
|
||||
limit: 20,
|
||||
standardHeaders: 'draft-7',
|
||||
legacyHeaders: false,
|
||||
message: 'Слишком много запросов к /export.',
|
||||
});
|
||||
|
||||
app.use(express.static(path.join(__dirname, 'public')));
|
||||
app.use(express.urlencoded({ extended: true, limit: '32kb' }));
|
||||
app.use(cookieParser());
|
||||
|
||||
Reference in New Issue
Block a user