Ответ
При разработке на Node.js я внедряю многоуровневую защиту, начиная с валидации ввода и заканчивая конфигурацией сервера.
1. Валидация и санация всех входных данных:
Первая линия обороны. Я использую библиотеки Joi или express-validator для строгой проверки данных от пользователя и API-клиентов.
// Пример с express-validator
const { body, validationResult } = require('express-validator');
app.post('/api/users',
body('email').isEmail().normalizeEmail(),
body('password').isLength({ min: 8 }),
body('role').isIn(['user', 'admin']),
(req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
// Безопасная обработка данных
}
);
2. Защита от инъекций: Для работы с MongoDB использую Mongoose, который экранирует запросы, предотвращая NoSQL-инъекции. Для SQL-баз — Query Builder (Knex) или ORM (Sequelize, TypeORM) с параметризованными запросами.
3. Настройка HTTP-заголовков безопасности:
Модуль helmet автоматически устанавливает критически важные заголовки.
const helmet = require('helmet');
app.use(helmet({
contentSecurityPolicy: { // Кастомизация CSP
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'"],
},
},
}));
4. Аутентификация и авторизация:
- Для сессий —
express-sessionс надёжным хранилищем (Redis), secure и httpOnly флагами. - Для токенов — JWT, но храню refresh-токены в БД, а access-токены с коротким временем жизни. Никогда не храню секреты в коде, использую переменные окружения.
- Использую
bcryptилиargon2для хеширования паролей.
5. Защита от атак на доступность:
express-rate-limitдля ограничения числа запросов с одного IP.- `express-slow-down" для замедления ответов после множества запросов.
const rateLimit = require('express-rate-limit'); const limiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 минут max: 100, // Лимит запросов с одного IP message: 'Слишком много запросов с этого IP.' }); app.use('/api/auth/', limiter); // Особо строгий лимит для эндпоинтов входа
6. Безопасность зависимостей:
Регулярно запускаю npm audit и npm outdated, интегрирую snyk или dependabot в CI/CD для автоматического обнаружения уязвимостей.
7. Логирование и мониторинг:
Настраиваю структурированное логирование с winston или pino, обязательно логирую попытки неудачной аутентификации и подозрительную активность для последующего анализа.