First commit
This commit is contained in:
59
profiles/views.py
Normal file
59
profiles/views.py
Normal file
@@ -0,0 +1,59 @@
|
||||
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é")
|
||||
|
||||
Reference in New Issue
Block a user