fix(security): durcissement pré-prod — auth, DoS rendu, headers/CSP, rate-limit - #24
Conversation
Corrige les findings à faible risque de l'audit sécurité (SECURITY-AUDIT.md) : - Fail-fast au boot (plugin Nitro) : refuse de démarrer en prod si BETTER_AUTH_SECRET absent/faible ou APP_URL non-https (anti forge de session). - cv/export-pdf + cv/preview : exigent désormais l'auth (requireUserId). export-pdf gate le quota export_pdf et enregistre l'usage — ferme un DoS Chromium non authentifié + le bypass de quota. - mailer : ne logge plus jamais le magic-link en prod ; échec explicite si SMTP absent (le jeton d'auth ne fuite plus dans les logs). - auth : cookies de session forcés Secure en prod + trustedOrigins explicite. - generate : capture InsufficientCreditsError (course sur le dernier crédit) → 403 propre au lieu d'un 500. - cv-render-input : bornes de taille Zod (sections/bullets/textes) contre les payloads géants (amplification DoS + JSON abusif en base). Ajoute SECURITY-AUDIT.md (rapport complet, 12 findings + correctifs). Typecheck OK, 124/124 tests verts. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- nuxt-security : HSTS, X-Frame-Options DENY, nosniff, Referrer-Policy, Permissions-Policy, et CSP à nonce en **Report-Only** (n'applique rien tant que non validée au navigateur — retirer contentSecurityPolicyReportOnly ensuite). - requestSizeLimiter réglé au-dessus de 8 Mo (préserve l'upload PDF de cv-design/extract) ; rateLimiter global désactivé (géré finement ailleurs). - Better Auth rateLimit : magic-link bridé à 3 envois/min (anti email-bombing et énumération). Stockage mémoire — à passer sur store partagé en multi-instance. Vérifié : app boote (200), en-tête Content-Security-Policy-Report-Only présent. Typecheck OK, 124/124 tests verts. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
✅ Deploy Preview for monumental-speculoos-a69398 ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
|
Warning Review limit reached
Next review available in: 58 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (11)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
CSP validée au navigateur via un collecteur /api/csp-report (directive report-uri) en mode Report-Only : seule violation = les Google Fonts du rendu CV (cv-html.ts), autorisées explicitement (fonts.googleapis.com / fonts.gstatic.com). 0 violation résiduelle → bascule en Content-Security-Policy bloquante. - server/api/csp-report.post.ts : logge les violations (monitoring, conservé en prod). - font-src/style-src : allowlist Google Fonts (suivi #3 : auto-héberger pour retirer ces hôtes distants). Smoke-test navigateur OK (pages, aperçu CV iframe, export PDF). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Audit sécurité complet avant mise en prod (rapport détaillé dans
SECURITY-AUDIT.md) + correctifs des findings à faible risque, testés end-to-end.Findings corrigés
BETTER_AUTH_SECRETabsent/faible ouAPP_URLnon-httpsrequireUserId+ gate quota + metering surexport-pdf;requireUserIdsurpreviewrequestSizeLimiter(préserve l'upload 8 Mo)useSecureCookiesen prod +trustedOriginsexplicitecatch InsufficientCreditsError→ 403 propreTests réalisés (serveur + DB locaux)
POST /api/cv/export-pdfet/api/cv/previewsans session → 401Content-Security-Policy-Report-Only(n'applique rien)3×200 puis 429sur le vrai chemin/api/auth/sign-in/magic-linkpnpm typecheckOK, 124/124 tests vertsÀ faire ensuite (hors PR — nécessite décision/tests)
contentSecurityPolicyReportOnly)/analyzepar utilisateur (abus coût LLM) — seuil + stockage à décidernodemailer8→9, updatebetter-auth, sandbox Chromium (infra)Notes
/cv/demoexige désormais d'être connecté (conséquence de chore(ci): gate pre-merge local + dedupe vite (corrige typecheck rouge) #2).APP_URL=https, secrets via un gestionnaire de secrets.🤖 Generated with Claude Code