2025-11-03 20:35:01 +00:00
|
|
|
|
const rateLimit = require('express-rate-limit');
|
|
|
|
|
|
|
|
|
|
|
|
// Общий лимит для API
|
|
|
|
|
|
const generalLimiter = rateLimit({
|
2025-11-04 22:23:33 +00:00
|
|
|
|
windowMs: 15 * 1000, // 15 секунд
|
2025-11-03 20:35:01 +00:00
|
|
|
|
max: 100, // 100 запросов
|
|
|
|
|
|
message: 'Слишком много запросов, попробуйте позже',
|
|
|
|
|
|
standardHeaders: true,
|
|
|
|
|
|
legacyHeaders: false,
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// Строгий лимит для создания постов
|
|
|
|
|
|
const postCreationLimiter = rateLimit({
|
2025-11-04 22:23:33 +00:00
|
|
|
|
windowMs: 15 * 1000, // 15 секунд
|
|
|
|
|
|
max: 10, // 10 постов
|
2025-11-03 20:35:01 +00:00
|
|
|
|
message: 'Вы создаёте слишком много постов, подождите немного',
|
|
|
|
|
|
skipSuccessfulRequests: true,
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// Лимит для авторизации
|
|
|
|
|
|
const authLimiter = rateLimit({
|
2025-11-04 22:23:33 +00:00
|
|
|
|
windowMs: 15 * 1000, // 15 секунд
|
2025-11-03 20:35:01 +00:00
|
|
|
|
max: 5, // 5 попыток
|
|
|
|
|
|
message: 'Слишком много попыток авторизации',
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// Лимит для поиска
|
|
|
|
|
|
const searchLimiter = rateLimit({
|
2025-11-04 22:23:33 +00:00
|
|
|
|
windowMs: 15 * 1000, // 15 секунд
|
2025-11-03 20:35:01 +00:00
|
|
|
|
max: 30, // 30 запросов
|
|
|
|
|
|
message: 'Слишком много поисковых запросов',
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// Лимит для лайков/комментариев (защита от спама)
|
|
|
|
|
|
const interactionLimiter = rateLimit({
|
2025-11-04 22:23:33 +00:00
|
|
|
|
windowMs: 15 * 1000, // 15 секунд
|
2025-11-03 20:35:01 +00:00
|
|
|
|
max: 20, // 20 действий
|
|
|
|
|
|
message: 'Вы слишком активны, немного подождите',
|
|
|
|
|
|
});
|
|
|
|
|
|
|
2025-12-01 01:11:27 +00:00
|
|
|
|
// Мягкий лимит для прокси изображений (больше запросов, так как это медиа)
|
|
|
|
|
|
const proxyLimiter = rateLimit({
|
|
|
|
|
|
windowMs: 15 * 1000, // 15 секунд
|
|
|
|
|
|
max: 200, // 200 запросов (больше для загрузки множества изображений)
|
|
|
|
|
|
message: 'Слишком много запросов изображений',
|
|
|
|
|
|
skipSuccessfulRequests: true, // Не считать успешные запросы
|
|
|
|
|
|
});
|
|
|
|
|
|
|
2025-11-03 20:35:01 +00:00
|
|
|
|
module.exports = {
|
|
|
|
|
|
generalLimiter,
|
|
|
|
|
|
postCreationLimiter,
|
|
|
|
|
|
authLimiter,
|
|
|
|
|
|
searchLimiter,
|
2025-12-01 01:11:27 +00:00
|
|
|
|
interactionLimiter,
|
|
|
|
|
|
proxyLimiter
|
2025-11-03 20:35:01 +00:00
|
|
|
|
};
|
|
|
|
|
|
|