---
title: Sécurité & Content Security Policy (CSP)
description: Recommandations de sécurité, profil d'assainissement DOMPurify et directives CSP pour VertiWiki.
tags: [vertiwiki, securite, csp, dompurify, xss, francais]
---

# Sécurité & Content Security Policy (CSP)

> For the complete documentation index and agent navigation, see [llms.txt](/llms.txt).

VertiWiki s'exécutant intégralement dans le navigateur et chargeant dynamiquement des documents Markdown, la prévention des attaques de type Cross-Site Scripting (XSS) constitue un pilier architectural incontournable.

---

## 🛡️ Modèle Défensif Zéro-XSS

VertiWiki applique des mécanismes de filtrage stricts à chaque niveau de la chaîne de traitement :

```mermaid
graph LR
    MD[Markdown Brut] --> Marked[Compilateur Marked]
    Marked --> RawHTML[Chaîne HTML Intermédiaire]
    RawHTML --> DOMPurify[Profil Durci DOMPurify]
    DOMPurify --> SafeDOM[DOM Assaini & Sûr]
    SafeDOM --> Mount[Montage dans #verti-app]
```

### 1. Assainissement DOMPurify
Tout code HTML issu de `marked` est soumis à `DOMPurify.sanitize()` :
- Les balises `<script>`, `<object>`, `<embed>` et gestionnaires d'événements (`onload`, `onerror`) sont purgés.
- Les diagrammes SVG Mermaid sont filtrés avec précaution pour préserver les balises `<foreignObject>` et `<style>`.
- Les balises MathML de KaTeX sont conservées en toute sécurité.

### 2. Validation des URLs
Les liens et images sont validés par `sanitizeUrl()`, désamorçant les protocoles dangereux (`javascript:`, `vbscript:`).

### 3. Échappement HTML Contextuel
Les chaînes interpolées dynamiquement (recherche, miettes de pain, 404) sont protégées par `escapeHtml()`.

### 4. Sandboxing des Iframes & Protocole de Présentation
Les balises brutes `<iframe>` insérées dans les documents Markdown sont interceptées par les filtres DOMPurify dans `src/core/parser.ts`. VertiWiki applique un attribut sandbox par défaut strict et sécurisé :
```html
sandbox="allow-scripts allow-same-origin allow-popups allow-forms allow-presentation"
```
Cette configuration exclut délibérément `allow-top-navigation`, interdisant aux cadres intégrés non fiables de détourner la fenêtre parente (frame busting), tout en permettant les présentations diapositives et intégrations multimédias grâce à `allow-presentation`. Les attributs `sandbox` définis explicitement par les auteurs sont respectés.

### 5. Neutralisation des Schémas de Liens Dangereux
En complément de la validation des URLs, le routeur client dans `src/core/router.ts` examine l'ensemble des balises de liens (`<a>`). Tout hyperlien initiant des protocoles exécutables (`javascript:`, `vbscript:`) voit son attribut `href` immédiatement supprimé avant toute injection dans le DOM.

---

## 🔒 Directives CSP Recommandées

Pour un environnement de production hautement sécurisé (Nginx, Cloudflare, Apache, Vercel), appliquez les en-têtes de réponse suivants :

```http
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self'; object-src 'none'; frame-ancestors 'none'; base-uri 'self';
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: geolocation=(), microphone=(), camera=()
```

> [!NOTE]
> La directive `'unsafe-inline'` pour `style-src` est indispensable car VertiWiki injecte dynamiquement des variables CSS pour les thèmes et la coloration syntaxique.

---

## 🛑 Modèle de Menaces & Sandboxing

| Vecteur de Menace | Atténuation dans VertiWiki |
| :--- | :--- |
| **Rédaction Markdown Malveillante** | Filtrage DOMPurify strict purgeant les balises et attributs non autorisés. |
| **Détournement d'Iframe / Frame Busting** | Bac à sable automatisé des iframes omettant `allow-top-navigation`. |
| **Exécution de Schémas de Scripts** | Les schémas `javascript:` et `vbscript:` sont purgés des ancres par le routeur. |
| **Injection dans les Résultats de Recherche** | Échappement systématique des extraits MiniSearch via `escapeHtml()`. |
| **Zoom Involontaire sur Images Liées** | La visionneuse Lightbox ignore les images imbriquées dans des liens (`:not(a img)`). |
| **Clickjacking / Intégration en Cadre** | Verrouillé par `X-Frame-Options: DENY` et CSP `frame-ancestors 'none'`. |
| **Sniffing de Types MIME** | Neutralisé par `X-Content-Type-Options: nosniff`. |
| **Fuite de Données via Télémétrie** | Les scripts d'analyse ne s'activent que sur déclaration explicite dans `config.json`. |

---

## 🔗 Prochaines Étapes

- Consultez les architectures de serveurs dans le [Runbook Opérationnel](../operations/runbook.md).
- Examinez les méthodes de sécurité dans la [Référence API](../reference/api.md).
