const validator = require('validator'); // Валидация и санитизация входных данных const sanitizeInput = (req, res, next) => { // Рекурсивная функция для очистки объекта const sanitizeObject = (obj) => { if (typeof obj !== 'object' || obj === null) { return typeof obj === 'string' ? validator.escape(obj) : obj; } if (Array.isArray(obj)) { return obj.map(item => sanitizeObject(item)); } const sanitized = {}; for (const key in obj) { if (obj.hasOwnProperty(key)) { const value = obj[key]; if (typeof value === 'string') { sanitized[key] = validator.escape(validator.trim(value)); } else { sanitized[key] = sanitizeObject(value); } } } return sanitized; }; // Очистка body if (req.body) { req.body = sanitizeObject(req.body); } // Очистка query if (req.query) { req.query = sanitizeObject(req.query); } // Очистка params (только строковые значения) if (req.params) { for (const key in req.params) { if (typeof req.params[key] === 'string') { req.params[key] = validator.escape(req.params[key]); } } } next(); }; // Валидация URL const validateUrl = (url) => { if (!url || typeof url !== 'string') { return false; } // Проверка на path traversal if (url.includes('..') || url.includes('./') || url.includes('../')) { return false; } // Проверка на валидный URL return validator.isURL(url, { protocols: ['http', 'https'], require_protocol: true, require_valid_protocol: true }); }; // Валидация Telegram User ID const validateTelegramId = (id) => { if (!id || typeof id !== 'number' && typeof id !== 'string') { return false; } const numId = typeof id === 'string' ? parseInt(id, 10) : id; return !isNaN(numId) && numId > 0 && numId < Number.MAX_SAFE_INTEGER; }; // Валидация контента поста const validatePostContent = (content) => { if (!content || typeof content !== 'string') { return false; } // Максимальная длина if (content.length > 5000) { return false; } // Проверка на опасные паттерны const dangerousPatterns = [ /