# En-têtes de sécurité et Content-Security-Policy L'application web est durcie par défaut via le plugin Vite [`apps/web/vite-plugin-csp.ts`](../apps/web/vite-plugin-csp.ts). Il injecte une **Content-Security-Policy** dans le HTML de chaque page (et un `serve.json` en build) et émet plusieurs en-têtes de sécurité complémentaires. ## Vue d'ensemble | En-tête | Valeur | Émis par | | --- | --- | --- | | `Content-Security-Policy` | `default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self'; font-src 'self'; connect-src 'self'; media-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'; frame-src 'none'` | Plugin Vite (dev + build) | | `X-Content-Type-Options` | `nosniff` | Plugin Vite | | `Referrer-Policy` | `strict-origin-when-cross-origin` | Plugin Vite | | `X-Frame-Options` | `DENY` | Plugin Vite | | `Permissions-Policy` | `accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()` | Plugin Vite | En **build de production**, le plugin écrit en plus `dist/serve.json` ; le serveur statique `serve` (cf. [`Dockerfile`](../Dockerfile) : `CMD ["serve", "-s", "dist", "-l", "3000"]`) applique les en-têtes déclarés. En **dev** (Vite), le plugin injecte la CSP via `` **et** pose les en-têtes de réponse via un middleware Connect. La CSP dev assouplit `script-src` et `style-src` avec `'unsafe-inline'` + `'unsafe-eval'`, et `connect-src` avec `ws:` / `wss:` pour ne pas casser HMR. ## Adapter la CSP à Matomo Le serveur Matomo est optionnel (cf. [matomo-analytics.md](matomo-analytics.md)). Quand `VITE_MATOMO_URL` est défini au build, son origine est ajoutée à `script-src`, `connect-src` et `img-src` : ```bash # Build local avec Matomo VITE_MATOMO_URL=https://analytics.example.com/ \ npm run build:web ``` La CSP générée ressemblera à : ``` default-src 'self'; script-src 'self' 'https://analytics.example.com'; style-src 'self'; img-src 'self' 'https://analytics.example.com'; font-src 'self'; connect-src 'self' 'https://analytics.example.com'; media-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'; frame-src 'none' ``` Sans `VITE_MATOMO_URL`, **aucune origine externe** n'est ajoutée : la surface d'attaque est minimale. > **Pourquoi `script-src` autorise `'self'` sans `unsafe-inline` en prod ?** Vite produit un bundle compilé référencé via `