Que fait django-access-review ?
Révision de contrôle d'accès et de sécurité IDOR pour Django. Utilisez-le lors de la révision de vues Django, de DRF viewsets, de requêtes ORM ou de tout code Python/Django gérant l'autorisation utilisateur. Mots-clés déclencheurs : "IDOR", "contrôle d'accès", "autorisation", "permissions Django", "permissions d'objet", "isolation de locataire", "accès cassé".
Vue d'ensemble
Cette compétence analyse le code Django/DRF pour détecter les vulnérabilités liées au contrôle d'accès et aux IDOR. Elle vérifie que les vérifications d'autorisation sont correctement appliquées et que les utilisateurs ne peuvent pas accéder aux ressources auxquelles ils ne sont pas autorisés.
Comment ça marche
- Analyse des vues : Examine les vues fonctionnelles, les vues basées sur les classes et les viewsets DRF pour vérifier la présence de vérifications d'accès appropriées.
- Inspection des décorateurs : Vérifie les décorateurs comme
@login_required,@permission_required,@user_passes_test, etc. - Analyse des permissions DRF : Vérifie les classes
permission_classes,get_permissions()et la logique personnalisée dans les viewsets. - Filtrage des requêtes ORM : Détecte les cas où les requêtes ORM ne filtrent pas par utilisateur ou organisation (isolation de locataire).
- Permissions d'objet : Vérifie l'utilisation de
has_object_permission(),check_object_permissions()et les vérifications manuelles.
Mots-clés déclencheurs
- IDOR
- contrôle d'accès
- autorisation
- permissions Django
- permissions d'objet
- isolation de locataire
- accès cassé
Exemple d'analyse
# Exemple de vulnérabilité IDOR potentielle
class ProfileView(View):
def get(self, request, user_id):
# MANQUE : vérification que l'utilisateur connecté correspond à user_id
profile = get_object_or_404(Profile, id=user_id)
return render(request, 'profile.html', {'profile': profile})
# Correction recommandée
class ProfileView(View):
@method_decorator(login_required)
def get(self, request, user_id):
if request.user.id != user_id and not request.user.is_staff:
raise PermissionDenied
profile = get_object_or_404(Profile, id=user_id)
return render(request, 'profile.html', {'profile': profile})
Bonnes pratiques
- Utilisez toujours
login_requiredou des vérifications similaires pour les vues nécessitant une authentification. - Appliquez des permissions au niveau des objets en plus des permissions au niveau des vues pour les données multi-utilisateurs.
- Filtrez les requêtes ORM par l'utilisateur connecté (par exemple,
MyModel.objects.filter(user=request.user)). - Utilisez les classes de permission DRF (
IsAuthenticated,IsAdminUser, des classes personnalisées) dans les viewsets. - Évitez d'exposer des identifiants séquentiels facilement devinables dans les URL pour les ressources sensibles.