215 lines
5.3 KiB
Markdown
215 lines
5.3 KiB
Markdown
---
|
|
name: auditing-security
|
|
description: Audits application security (XSS, CSP, vulnerable dependencies, CORS). Use before releases, after adding dependencies, or modifying security-utils.js
|
|
allowed-tools: Read, Grep, Glob, Bash, WebSearch
|
|
---
|
|
|
|
# Security Audit
|
|
|
|
Audite la sécurité de l'application web selon standards OWASP et best practices.
|
|
|
|
## Table des matières
|
|
|
|
- [Quand utiliser](#quand-utiliser)
|
|
- [Domaines de sécurité](#domaines-de-sécurité)
|
|
- [Checklist sécurité](#checklist-sécurité)
|
|
- [Outils d'audit](#outils-daudit)
|
|
- [En cas de doute](#en-cas-de-doute)
|
|
|
|
## Quand utiliser
|
|
|
|
- Avant chaque release en production
|
|
- Après ajout/mise à jour dépendances npm
|
|
- Modifications de `security-utils.js`
|
|
- Warnings eslint-plugin-security
|
|
- Avant commit manipulant HTML dynamique
|
|
- Ajout de scripts externes (CDN, analytics)
|
|
|
|
## Domaines de sécurité
|
|
|
|
### 1. XSS (Cross-Site Scripting) Prevention
|
|
|
|
**Règle absolue : Utiliser security-utils.js**
|
|
|
|
Trouve security-utils.js pour voir fonctions disponibles :
|
|
|
|
- `appendSanitizedHTML()` - Insérer HTML dynamique
|
|
- `createSafeElement()` - Créer élément avec contenu sécurisé
|
|
- `setSafeMessage()` - Définir texte (pas HTML)
|
|
|
|
**Dangers :**
|
|
|
|
- `innerHTML` avec user input → XSS
|
|
- Fonctions d'exécution dynamique avec données externes
|
|
- Event handlers depuis user input
|
|
|
|
**Exceptions sécurisées :**
|
|
|
|
- `innerHTML = ''` (nettoyage)
|
|
- `getTranslation()` output (contenu interne)
|
|
|
|
### 2. Content Security Policy (CSP)
|
|
|
|
**Principe : Meta tag CSP dans index.html**
|
|
|
|
Examine index.html pour voir configuration CSP actuelle.
|
|
|
|
**Baseline restrictive :**
|
|
|
|
- `default-src 'self'`
|
|
- Pas de `'unsafe-eval'` dans script-src
|
|
- `'unsafe-inline'` limité au strict nécessaire
|
|
- `frame-ancestors 'none'` pour prévenir clickjacking
|
|
|
|
**Scripts externes :**
|
|
|
|
- Toujours `crossorigin="anonymous"`
|
|
- Integrity hashes pour bibliothèques statiques
|
|
- PAS d'integrity pour analytics (auto-update)
|
|
- Documenter exceptions avec commentaires
|
|
|
|
### 3. Dependency Vulnerabilities
|
|
|
|
**Commandes audit :**
|
|
|
|
```bash
|
|
npm audit # Scan vulnérabilités
|
|
npm audit --json # Rapport détaillé
|
|
npm audit fix # Fix auto (patch/minor)
|
|
npm audit fix --force # Fix breaking (attention!)
|
|
```
|
|
|
|
**Niveaux de sévérité :**
|
|
|
|
- **Critical/High** : Fix immédiatement avant release
|
|
- **Moderate** : Fix dans sprint suivant
|
|
- **Low** : Monitorer, fix si possible
|
|
|
|
**Vérifier :**
|
|
|
|
- Pas de dépendances deprecated
|
|
- Versions à jour (pas trop anciennes)
|
|
- Licences compatibles
|
|
|
|
### 4. HTTPS et Mixed Content
|
|
|
|
**Vérifier :**
|
|
|
|
- HTTPS obligatoire en production
|
|
- Pas de resources HTTP (mixed content)
|
|
- Redirection HTTP → HTTPS
|
|
- HSTS header
|
|
|
|
Examine configuration serveur ou CDN.
|
|
|
|
### 5. Secrets et Credentials
|
|
|
|
**Règles :**
|
|
|
|
- **JAMAIS** committer secrets (API keys, tokens, passwords)
|
|
- **JAMAIS** stocker passwords en LocalStorage
|
|
- Utiliser variables d'environnement
|
|
- .gitignore pour fichiers sensibles (.env, credentials.json)
|
|
|
|
**Vérifier :**
|
|
|
|
- Pas de secrets hardcodés dans code
|
|
- .env dans .gitignore
|
|
- Terraform state pas committé
|
|
|
|
### 6. LocalStorage Security
|
|
|
|
**Données sensibles :**
|
|
|
|
- **JAMAIS** tokens d'authentification
|
|
- **JAMAIS** passwords ou PII
|
|
- OK pour préférences utilisateur non sensibles
|
|
|
|
**Vérifier :**
|
|
|
|
- storage.js utilise localStorage correctement
|
|
- Pas de données sensibles stockées
|
|
- Données validées avant lecture
|
|
|
|
## Checklist sécurité
|
|
|
|
- [ ] Tous `innerHTML` utilisent `appendSanitizedHTML()` ou justifiés
|
|
- [ ] Pas de fonctions d'exécution dynamique avec données externes
|
|
- [ ] Meta tag CSP présent dans index.html
|
|
- [ ] `crossorigin="anonymous"` sur scripts externes
|
|
- [ ] `npm audit` sans Critical/High
|
|
- [ ] Pas de secrets hardcodés
|
|
- [ ] Pas de données sensibles en LocalStorage
|
|
- [ ] HTTPS en production
|
|
- [ ] Pas de mixed content
|
|
- [ ] Tests sécurité passent
|
|
|
|
## Outils d'audit
|
|
|
|
**ESLint Security :**
|
|
|
|
```bash
|
|
npm run lint # Inclut eslint-plugin-security
|
|
```
|
|
|
|
**Dependency Scan :**
|
|
|
|
```bash
|
|
npm audit
|
|
```
|
|
|
|
**Lighthouse Security Audit :**
|
|
|
|
- Lance Chrome DevTools → Lighthouse
|
|
- Vérifie section Security
|
|
- Score doit être 100
|
|
|
|
**OWASP ZAP (optionnel) :**
|
|
|
|
- Scan automatisé pour vulnérabilités web
|
|
- Tests de pénétration
|
|
|
|
## En cas de doute
|
|
|
|
**Source :** security-utils.js + CLAUDE.md
|
|
|
|
**Fichiers clés :**
|
|
|
|
1. `js/security-utils.js` - Fonctions sécurité du projet
|
|
2. `eslint.config.js` - Règles security ESLint
|
|
3. `index.html` - Configuration CSP
|
|
4. `CLAUDE.md` - Guidelines sécurité
|
|
|
|
**Règles absolues :**
|
|
|
|
1. TOUJOURS utiliser security-utils.js pour manipulation DOM
|
|
2. TOUJOURS audit avant release (`npm audit`)
|
|
3. JAMAIS `innerHTML` avec user input direct
|
|
4. JAMAIS stocker données sensibles en LocalStorage
|
|
5. JAMAIS scripts externes sans `crossorigin="anonymous"`
|
|
|
|
**Workflow minimal avant commit :**
|
|
|
|
```bash
|
|
npm run lint # ESLint security rules
|
|
npm audit # Dependency check
|
|
npm test # Security tests
|
|
```
|
|
|
|
**Workflow complet avant release :**
|
|
|
|
```bash
|
|
npm run verify # Full quality gate
|
|
npm audit --audit-level=moderate # Dependency audit
|
|
# Lighthouse security audit
|
|
# Review index.html CSP config
|
|
```
|
|
|
|
**Red flags (arrêter immédiatement) :**
|
|
|
|
- Fonctions d'exécution dynamique avec données externes
|
|
- `innerHTML = userInput`
|
|
- Tokens/passwords en LocalStorage
|
|
- npm audit Critical/High
|
|
- Scripts CDN sans crossorigin
|