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é")