# ✅ Vérification humaine — `dev-verif-4` (CSP)

**Branche :** `dev-verif-4` (empilée sur `dev-verif-3`)
**Lot :** Content Security Policy
**Date :** 2026-06-01

## Item d'audit corrigé

| Item (spec) | Avant | Après |
|---|---|---|
| security / **content-security-policy** | ❌ aucun CSP | ⚠️→✅ CSP complète en **Report-Only** + `frame-ancestors` enforce |

## ⚠️ Pourquoi Report-Only (et pas enforcing tout de suite)

Un CSP *enforcing* mal calibré **casse le JS en navigateur** (scripts/styles/iframes bloqués) — et ça **ne se voit pas via curl/build**, seulement dans la console du navigateur. Comme l'audit tourne sans navigateur, livrer un CSP enforcing à l'aveugle serait dangereux.

→ La policy complète est livrée en **`Content-Security-Policy-Report-Only`** : elle **ne bloque rien**, elle remonte les violations en console. `frame-ancestors 'none'` reste, lui, **enforce** (sans risque).

## Changements (fichiers)

- `next.config.ts` — const `CSP_REPORT_ONLY` (15 directives) + header `Content-Security-Policy-Report-Only` dans le bloc global.

## Sources autorisées (calibrées sur le code réel)

| Directive | Sources | Raison |
|---|---|---|
| script-src | self + `'unsafe-inline'`+`'unsafe-eval'` + app.cal.com, cal.com, googletagmanager | hydratation Next + Cal.com embed + GA (consenti) |
| connect-src | self + analytics.elevaseo.app + cal + google-analytics/tagmanager | ingestion OpenPanel auto-hébergé + Cal + GA |
| img-src | self, data:, blob: + aceternity, unsplash, pravatar, google-analytics | `images.remotePatterns` + pixel GA |
| frame-src | app.cal.com, cal.com | iframe Cal.com |

## Preuve (build prod local :3001)

```
Content-Security-Policy: frame-ancestors 'none'            (enforce)
Content-Security-Policy-Report-Only: default-src 'self'; … (15 directives)
```
`pnpm build` : exit 0. _(Note env : le build a nécessité le réseau pour `next/font` — Google Fonts ; à terme self-host la police, cf. lot perf.)_

## 🔴 GATE HUMAIN — à faire AVANT de basculer en enforcing

1. [ ] Ouvrir le site (prod/preview) dans un navigateur, **console ouverte**, et parcourir : home, un guide, l'outil comparateur, **le CTA Cal.com**, **accepter les cookies** (charge GA).
2. [ ] Relever les lignes `[Report Only] Refused to … because it violates the following Content Security Policy directive: …`.
3. [ ] Ajouter les sources manquantes à `CSP_REPORT_ONLY`, re-tester jusqu'à **0 violation**.
4. [ ] **Bascule** : renommer le header `Content-Security-Policy-Report-Only` → fusionner dans `Content-Security-Policy` (en gardant `frame-ancestors`). Idéalement, viser ensuite un CSP **nonce-based** (retirer `'unsafe-inline'` du script-src) — gros chantier séparé.

## Décision

- [ ] **Report-Only validé** (mergeable tel quel — ne bloque rien).
- [ ] **Bascule enforcing** faite après QA navigateur ci-dessus.
- [ ] Corrections demandées :

> _Notes du vérificateur :_
