security: appliquer les findings de l'audit OWASP (H1→B3)

H1 — trusted_proxies RFC-1918 dans framework.yaml : rate limiting
     opérationnel derrière Traefik (IP client réelle, pas IP Traefik)

H2 — En-têtes HTTP dans Caddyfile : X-Frame-Options DENY,
     X-Content-Type-Options nosniff, Referrer-Policy, Permissions-Policy,
     suppression header Server

H3 — API Platform docs désactivés en when@prod (Swagger UI, ReDoc)

M1 — Rate limiter sur DELETE /api/push/subscribe (manquant)
M2 — Validation FILTER_VALIDATE_URL sur endpoint push avant stockage
M3 — APP_ENV=prod dans backend/.env (était dev — risque si .env.local absent)
M4 — Limite 4096 octets sur le body JSON (FeedbackController + PushController)
M5 — Service Worker : open redirect corrigé (targetUrl validé contre l'origine)

B1 — robots.txt créé (bloque /api/ et /bundles/)
B3 — --time-limit=3600 sur les workers Messenger (rotation + libération mémoire)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Gwadaking
2026-04-10 00:49:15 -04:00
parent 0d9c85e71b
commit cda9a7a8ff
9 changed files with 57 additions and 5 deletions

View File

@@ -1,5 +1,5 @@
api_platform:
title: Hello API Platform
title: Radar Sargasses Caraïbes API
version: 1.0.0
formats:
json: ['application/json']
@@ -8,3 +8,9 @@ api_platform:
stateless: true
cache_headers:
vary: ['Content-Type', 'Authorization', 'Origin']
when@prod:
api_platform:
enable_docs: false
enable_swagger_ui: false
enable_re_doc: false

View File

@@ -5,6 +5,17 @@ framework:
# Note that the session will be started ONLY if you read or write from it.
session: true
# Derrière Traefik (RFC-1918) — nécessaire pour que getClientIp() retourne
# l'IP réelle du client et non l'IP interne du reverse proxy.
# Sans ça, le rate limiting est inopérant (tous les clients partagent l'IP Traefik).
trusted_proxies: '127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16'
trusted_headers:
- 'x-forwarded-for'
- 'x-forwarded-host'
- 'x-forwarded-proto'
- 'x-forwarded-port'
- 'x-forwarded-prefix'
#esi: true
#fragments: true