SECURITE.md 3.8 KB

🔒 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.

# 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 :

pip install bleach

Utilisation :

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 :

except:  # Attrape TOUT, même les erreurs critiques
    pass

Solution : Capturer des exceptions spécifiques

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 :

# 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é

# À 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