Files
ENI-PythonAdvanced_12/profiles/views.py
2025-12-18 14:35:15 +01:00

60 lines
2.0 KiB
Python

from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.shortcuts import render
from django.views.generic import DetailView
from .models import Profile
#
# 1. LA VUE VULNÉRABLE (IDOR)
#
class VulnerableProfileView(LoginRequiredMixin, DetailView):
"""
Cette vue est VULNÉRABLE au Broken Access Control (IDOR).
- LoginRequiredMixin: Vérifie si l'utilisateur est connecté.
- DetailView: Récupère un objet par sa clé primaire (pk) passée dans l'URL.
PROBLÈME: Elle ne vérifie jamais si l'utilisateur connecté
est le *propriétaire* du profil qu'il demande.
"""
model = Profile
template_name = 'profiles/profile_detail.html'
context_object_name = 'profile' # Nom de l'objet dans le template
#
# 2. LA VUE SÉCURISÉE (CORRIGÉE)
#
class SecureProfileView(LoginRequiredMixin, UserPassesTestMixin, DetailView):
"""
Cette vue est CORRIGÉE et protège contre l'IDOR.
- UserPassesTestMixin: Ajoute un test de permission personnalisé.
La vue n'est rendue que si la méthode `test_func` renvoie True.
Sinon, elle renvoie un "403 Forbidden".
"""
model = Profile
template_name = 'profiles/profile_detail.html'
context_object_name = 'profile'
def test_func(self):
"""
La fonction de test pour UserPassesTestMixin.
C'est le cœur de la correction.
"""
# 1. Récupère l'objet Profile que DetailView a trouvé (via self.get_object())
profile_to_view = self.get_object()
# 2. Vérifie si l'utilisateur de la requête (connecté)
# est le même que l'utilisateur lié à ce profil.
is_owner = (self.request.user == profile_to_view.user)
return is_owner
# Optionnel: Si vous préférez renvoyer un 404 (Not Found) au lieu d'un 403 (Forbidden)
# pour cacher l'existence de l'objet, vous pouvez surcharger handle_no_permission.
# def handle_no_permission(self):
# from django.http import Http404
# raise Http404("Profil non trouvé")