fix: A20 (partiel) — CSP nonce par requête, unsafe-inline sort de script-src (v7.7.0)
- ContentSecurityPolicyMiddleware : nonce aléatoire par requête dans la
ContextVar `CSP_NONCE` (posée avant `call_next` → visible des templates),
`script-src 'self' 'unsafe-eval' 'nonce-…'` — plus aucun script inline
sans nonce ne tourne (fin des XSS injectés en JS)
- 38 tags `<script>` des templates : `nonce="{{ csp_nonce() }}"` (passage
scripté, vérifié : 0 restant) ; `LOCAL_LOGIN_HTML` (constante de module) :
helper `_with_nonce()` au rendu ; collections.py : 3 scripts Python
(chart/form/map) noncés
- `<meta name="htmx-config" content='{"inlineScriptNonce": …}'>` dans base.html
: htmx ré-injecte les <script> des réponses boostées avec le bon nonce
- `script-src-attr 'unsafe-inline'` : les 74 handlers `onclick=` inline
restent couverts (le nonce les aurait désactivés aussi)
- chart.js (cdn.jsdelivr.net) et leaflet (unpkg) ajoutés à script-src/style-src
: vues chart/map déjà BLOQUÉES par la CSP depuis toujours
(commentaire ponytail: upgrade = vendoriser puis retirer les hôtes)
- reste d'A20 : unsafe-eval (Alpine x-data → @alpinejs/csp), externalisation
JS (A27), resserrer img-src/connect-src
test : test_csp_nonce_per_request (page base.html + page hors template,
nonce unique par requête)
suite **1037/1037** · `ruff check app tests` OK · docs à jour
This commit is contained in:
@@ -1,5 +1,33 @@
|
||||
# Changelog - FlowDeck
|
||||
|
||||
## v7.7.0 (2026-10-01) — Audit : A20 (CSP — nonce, partie 1)
|
||||
|
||||
### Security
|
||||
|
||||
- **A20** — `script-src` : `'unsafe-inline'` remplacé par `'nonce-<aléatoire par
|
||||
requête>'`. Le middleware CSP génère le nonce dans une `ContextVar` avant
|
||||
`call_next` (visible des templates via `{{ csp_nonce() }}`) ; **38 tags
|
||||
`<script>` inline** des templates, la constante de module `LOCAL_LOGIN_HTML`
|
||||
(helper `_with_nonce()` au rendu) et **3 scripts Python** dans `collections.py`
|
||||
le portent ; htmx reçoit le même nonce via `<meta name="htmx-config">`
|
||||
(`inlineScriptNonce` — les scripts des réponses boostées restent valides)
|
||||
- Les 74 handlers `onclick=` inline restent fonctionnels via
|
||||
`script-src-attr 'unsafe-inline'` (détaché de `script-src` : le nonce les
|
||||
aurait désactivés aussi)
|
||||
- `https://cdn.jsdelivr.net` / `https://unpkg.com` ajoutés à `script-src` et
|
||||
`style-src` : les vues chart/map de `collections` les utilisent et étaient
|
||||
**bloquées par la CSP depuis toujours** (commentaire `ponytail:` → upgrade :
|
||||
vendoriser ces libs puis retirer les hôtes)
|
||||
- Reste d'A20 : `unsafe-eval` (Alpine `x-data` en string → build
|
||||
`@alpinejs/csp`), externalisation du JS inline (A27), resserrer
|
||||
`img-src`/`connect-src`
|
||||
|
||||
### Tests
|
||||
|
||||
- `test_csp_nonce_per_request` : page `base.html` (meta htmx-config + nonce du
|
||||
header identique sur tous les scripts inline, nonce différent d'une requête à
|
||||
l'autre) et page hors template (`/auth/login?provider=local`)
|
||||
|
||||
## v7.6.0 (2026-10-01) — Audit : A31 (dette migrations)
|
||||
|
||||
### Fixed
|
||||
|
||||
Reference in New Issue
Block a user