# 🔒 Sécurité - Blog Duhaz

## ✅ Améliorations de Sécurité Implémentées

### 1. Variables d'Environnement
- **SECRET_KEY** : Maintenant stockée dans `.env` (non commitée sur Git)
- **DEBUG** : Configurable par environnement
- **ALLOWED_HOSTS** : Liste blanche des domaines autorisés

### 2. Protection Git
- `.env` ajouté au `.gitignore`
- `.env.example` créé comme modèle (sans secrets)
- Ancienne SECRET_KEY compromise → nouvelle clé générée

### 3. Configuration Production
Paramètres de sécurité prêts dans `settings.py` (à décommenter) :
- `SECURE_SSL_REDIRECT` : Force HTTPS
- `SESSION_COOKIE_SECURE` : Cookies sécurisés
- `CSRF_COOKIE_SECURE` : Protection CSRF renforcée
- `SECURE_BROWSER_XSS_FILTER` : Protection XSS
- `X_FRAME_OPTIONS` : Protection clickjacking

---

## ⚠️ Vulnérabilités Restantes à Corriger

### 1. XSS (Cross-Site Scripting)
**Fichier** : `blog/views.py` et templates

**Problème** : Le contenu HTML des articles est injecté sans validation.

```python
# Dans blog/views.py, ligne 99
page.p_contenu = art.b_description  # Potentiellement dangereux
```

**Solution** : 
- Utiliser `{{ content|safe }}` uniquement pour le contenu de confiance
- Valider/nettoyer le HTML côté serveur avec `bleach` ou `html5lib`
- Ou utiliser `escape()` pour afficher du texte brut

**Installation** :
```bash
pip install bleach
```

**Utilisation** :
```python
import bleach

ALLOWED_TAGS = ['p', 'strong', 'em', 'u', 'h1', 'h2', 'h3', 'ul', 'ol', 'li', 'a', 'img']
ALLOWED_ATTRS = {'a': ['href', 'title'], 'img': ['src', 'alt']}

cleaned_content = bleach.clean(
    art.b_contenu, 
    tags=ALLOWED_TAGS, 
    attributes=ALLOWED_ATTRS,
    strip=True
)
```

### 2. Injection SQL
**État** : ✅ Protégé par l'ORM Django
Django utilise des requêtes paramétrées qui préviennent l'injection SQL.

### 3. CSRF (Cross-Site Request Forgery)
**État** : ✅ Protégé
Le middleware CSRF est activé. Assurez-vous d'utiliser `{% csrf_token %}` dans tous les formulaires.

### 4. Gestion des Exceptions
**Fichier** : `core/views.py`, `blog/views.py`

**Problème** : 
```python
except:  # Attrape TOUT, même les erreurs critiques
    pass
```

**Solution** : Capturer des exceptions spécifiques
```python
except ObjectDoesNotExist:
    # Gestion spécifique
    pass
except Exception as e:
    logger.error(f"Erreur: {e}")
    # Retourner une erreur appropriée
```

### 5. Upload de Fichiers
**Fichier** : `core/models.py` (Fichier model)

**Recommandations** :
- Valider les types MIME
- Limiter la taille des fichiers
- Scanner les uploads (antivirus)
- Stocker hors du MEDIA_ROOT si possible

**Configuration** :
```python
# Dans settings.py
FILE_UPLOAD_MAX_MEMORY_SIZE = 5242880  # 5 MB
DATA_UPLOAD_MAX_MEMORY_SIZE = 5242880  # 5 MB

ALLOWED_UPLOAD_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.pdf']
```

---

## 🔐 Checklist Sécurité Production

### Avant déploiement
- [ ] DEBUG = False
- [ ] SECRET_KEY unique et forte
- [ ] ALLOWED_HOSTS configuré correctement
- [ ] HTTPS activé (Let's Encrypt gratuit)
- [ ] Paramètres de sécurité décommentés
- [ ] Base de données PostgreSQL (pas SQLite)
- [ ] Sauvegardes automatiques configurées

### Monitoring
- [ ] Logs d'erreurs configurés
- [ ] Alertes de sécurité activées
- [ ] Surveillance des tentatives d'accès
- [ ] Mises à jour régulières de Django

### Headers de sécurité
```python
# À ajouter dans settings.py pour production
SECURE_HSTS_SECONDS = 31536000  # 1 an
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SECURE_REFERRER_POLICY = 'same-origin'
```

---

## 📚 Ressources

- [Django Security Guide](https://docs.djangoproject.com/en/5.1/topics/security/)
- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
- [Mozilla Web Security](https://infosec.mozilla.org/guidelines/web_security)
