.env (non commitée sur Git).env ajouté au .gitignore.env.example créé comme modèle (sans secrets)Paramètres de sécurité prêts dans settings.py (à décommenter) :
SECURE_SSL_REDIRECT : Force HTTPSSESSION_COOKIE_SECURE : Cookies sécurisésCSRF_COOKIE_SECURE : Protection CSRF renforcéeSECURE_BROWSER_XSS_FILTER : Protection XSSX_FRAME_OPTIONS : Protection clickjackingFichier : 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 :
{{ content|safe }} uniquement pour le contenu de confiancebleach ou html5libescape() pour afficher du texte brutInstallation :
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
)
État : ✅ Protégé par l'ORM Django Django utilise des requêtes paramétrées qui préviennent l'injection SQL.
État : ✅ Protégé
Le middleware CSRF est activé. Assurez-vous d'utiliser {% csrf_token %} dans tous les formulaires.
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
Fichier : core/models.py (Fichier model)
Recommandations :
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']
# À 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'