- Remove hardcoded database credentials from all scripts - Remove hardcoded Legacy API tokens from backend scripts - Remove hardcoded MQTT credentials from mqtt-test.js - Update backend/.env.example with DB_HOST, DB_USER, DB_PASSWORD, DB_NAME - Update backend/.env.example with LEGACY_API_TOKEN and MQTT credentials - Add dotenv config to all scripts requiring credentials - Create comprehensive documentation: - scripts/README.md - Root scripts usage - backend/scripts/README.md - Backend scripts documentation - MQTT_TESTING.md - MQTT testing guide - SECURITY_CREDENTIALS_CLEANUP.md - Security changes summary All scripts now read credentials from backend/.env instead of hardcoded values. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
4.5 KiB
PRD — WellNuo Security Audit Fix
Описание
Исправление 6 критичных уязвимостей из Security Audit перед релизом. Все задачи независимы друг от друга — можно выполнять параллельно.
Общее время: ~11 часов
Источник: AUDIT_REPORT.md
Задачи
Backend Security (worker1)
-
@worker1 VULN-001: Stripe Webhook Required — В файле
backend/src/routes/webhook.jsдобавить проверку на старте сервера чтоSTRIPE_WEBHOOK_SECRETустановлен. Если не установлен — выбросить ошибку и остановить сервер:if (!process.env.STRIPE_WEBHOOK_SECRET) { console.error('STRIPE_WEBHOOK_SECRET is required!'); process.exit(1); }. Убрать fallback наJSON.parseбез проверки подписи. -
@worker1 VULN-003: JWT Secret Validation — В файле
backend/src/index.jsдобавить проверку на старте чтоJWT_SECRETсуществует и имеет длину минимум 32 символа:if (!process.env.JWT_SECRET || process.env.JWT_SECRET.length < 32) { console.error('JWT_SECRET must be at least 32 characters!'); process.exit(1); }. -
@worker1 VULN-008: npm audit fix — Выполнить
cd backend && npm update qs && npm audit fixдля исправления известной DoS уязвимости в пакетеqs.
Auth Security (worker2)
- @worker2 VULN-004: OTP Rate Limiting — В файле
backend/src/routes/auth.jsдобавить rate limiting для endpoint/verify-otp. Установить пакетexpress-rate-limit. Создать limiter: 5 попыток за 15 минут, ключ по email или IP. Применить к роутуrouter.post('/verify-otp', otpLimiter, ...). Также добавить rate limit на/send-otp: 3 попытки за 15 минут.
Input Validation (worker3)
- @worker3 VULN-005: Input Validation — Установить пакет
express-validator. Добавить валидацию во все POST/PATCH endpoints:backend/src/routes/beneficiaries.js(name: string 1-200, email: optional email),backend/src/routes/stripe.js(priceId: string),backend/src/routes/invitations.js(email: valid email, role: enum). Использовать паттерн:body('field').isString().trim()..., затемvalidationResult(req)для проверки ошибок.
Secrets Management (worker4)
- @worker4 VULN-007: Doppler Setup — НЕ ВЫПОЛНЯТЬ АВТОМАТИЧЕСКИ! Это требует ручной работы. Создать файл
backend/DOPPLER_SETUP.mdс инструкцией: 1) Зарегистрироваться на doppler.com, 2) Создать проект WellNuo, 3) Добавить все секреты (DB_PASSWORD, JWT_SECRET, BREVO_API_KEY, STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, ADMIN_API_KEY, LEGACY_API_PASSWORD, LIVEKIT_API_KEY, LIVEKIT_API_SECRET), 4) Установить CLI:curl -Ls https://cli.doppler.com/install.sh | sh, 5) Изменить запуск в PM2:doppler run -- node index.js, 6) Удалить .env файл после миграции.
Контекст
Файлы для изменения
| Worker | Файлы |
|---|---|
| worker1 | backend/src/routes/webhook.js, backend/src/index.js, backend/package.json |
| worker2 | backend/src/routes/auth.js, backend/package.json |
| worker3 | backend/src/routes/beneficiaries.js, backend/src/routes/stripe.js, backend/src/routes/invitations.js, backend/package.json |
| worker4 | Создать backend/DOPPLER_SETUP.md |
Зависимости для установки
# worker2: rate limiting
npm install express-rate-limit
# worker3: validation
npm install express-validator
Важно
- НЕ трогать legacy API интеграцию — это заблокировано, ждём Phase 1/2
- Проверить что сервер запускается после каждого изменения
- Не ломать существующую логику — только добавляем проверки
После выполнения
Задеплоить на сервер:
ssh root@91.98.205.156
cd /var/www/wellnuo-api
git pull origin main
npm install
pm2 restart wellnuo-api
pm2 logs wellnuo-api --lines 30