5.6 KiB
5.6 KiB
Безопасность модераторского сайта
Меры безопасности
1. Шифрование паролей
✅ Пароли зашифрованы с использованием bcrypt
- Используется
bcrypt.hash()с солью 10 раундов - Пароли никогда не хранятся в открытом виде
passwordHashимеетselect: falseв модели User - не возвращается в API ответах
2. Защита API
✅ Rate Limiting
- Авторизация: 5 попыток за 15 секунд
- Отправка кода: 1 запрос в минуту
- Общий лимит: 100 запросов за 15 секунд
✅ Middleware безопасности
- Helmet - защита HTTP headers
- XSS Protection - защита от XSS атак
- MongoDB Sanitize - защита от NoSQL injection
- HPP Protection - защита от HTTP Parameter Pollution
- DDoS Protection - защита от DDoS
✅ JWT Токены
- Access token: 5 минут жизни
- Refresh token: 7 дней
- Токены хранятся в httpOnly cookies в production
- Секретные ключи настраиваются через .env
3. Защита данных
✅ Email не возвращается в API ответах
- Email используется только для авторизации
- Не включается в JWT payload
- Не возвращается в
/meи других эндпоинтах
✅ Пароли
- Никогда не возвращаются в ответах API
- Хранятся только как bcrypt hash
- Проверка через
bcrypt.compare()только при входе
4. Авторизация
✅ Двухфакторная авторизация для админов
- Код подтверждения отправляется на email владельца (aaem9848@gmail.com)
- Код действителен 5 минут
- Fallback на Telegram если email не работает
✅ Проверка ролей
- Все эндпоинты модерации проверяют роль пользователя
- Только
moderatorиadminимеют доступ - Владелец имеет дополнительные права
5. Валидация данных
✅ Валидация входных данных
- Email валидируется через
validator.isEmail() - Пароль минимум 6 символов
- Все данные санитизируются перед сохранением
6. Логирование безопасности
✅ События безопасности логируются
- Неудачные попытки входа
- Невалидные токены
- Попытки несанкционированного доступа
- Все события логируются через
logSecurityEvent()
7. CORS и Headers
✅ CORS настройки
- Настраивается через
MODERATION_CORS_ORIGIN - Credentials включены для cookies
- Ограниченные методы и headers
✅ Security Headers
- X-Frame-Options: SAMEORIGIN
- X-Content-Type-Options: nosniff
- X-XSS-Protection: 1; mode=block
- Referrer-Policy: no-referrer-when-downgrade
Рекомендации для production
-
Измените секретные ключи:
JWT_SECRET=your_very_secure_random_string JWT_ACCESS_SECRET=another_secure_random_string JWT_REFRESH_SECRET=yet_another_secure_random_string -
Настройте HTTPS (обязательно):
- SSL сертификат через Let's Encrypt
- Все HTTP редиректятся на HTTPS
-
Защитите .env файл:
chmod 600 .env- Не коммитьте .env в git
- Используйте переменные окружения в Docker
-
Ограничьте доступ к MongoDB:
- Используйте firewall
- Ограничьте IP адреса
- Используйте аутентификацию MongoDB
-
Мониторинг:
- Следите за логами безопасности
- Настройте алерты на подозрительную активность
- Регулярно проверяйте логи авторизации
Переменные окружения для безопасности
# JWT секреты (ОБЯЗАТЕЛЬНО измените в production!)
JWT_SECRET=your_secure_secret
JWT_ACCESS_SECRET=your_access_secret
JWT_REFRESH_SECRET=your_refresh_secret
# Email для кодов подтверждения админа
OWNER_EMAIL=aaem9848@gmail.com
# CORS (ограничьте в production)
MODERATION_CORS_ORIGIN=https://moderation.nkm.guru
# Внутренний токен бота (опционально)
INTERNAL_BOT_TOKEN=your_internal_bot_token
Проверка безопасности
# Проверить что пароли не возвращаются
curl -H "Authorization: Bearer YOUR_TOKEN" https://moderation.nkm.guru/api/moderation-auth/me
# Проверить rate limiting
for i in {1..10}; do curl -X POST https://moderation.nkm.guru/api/moderation-auth/login -d '{"email":"test@test.com","password":"wrong"}'; done
# Проверить защиту от SQL injection
curl -X POST https://moderation.nkm.guru/api/moderation-auth/login -d '{"email":{"$ne":null},"password":"test"}'