Я был вдохновлен статьей How I could delete any video on YouTube и хотел проверить, если в моем Джанго проекте все работает безопасно, и в конечном итоге здесь.
Это довольно важный вопрос! И ответ очень хороший.
Django Rest Framework
делает ложное впечатление, что все работает нормально, когда вы просматриваете его через просматриваемый API-интерфейс.
объекта, который пользователь владеет Аутентифицировать:
объект, который аутентификации пользователя делает НЕ владеет:
Hidden DELETE кнопка заставляет вас чувствовать, что все в порядке.
Вы аутентифицированы, кнопка удаления скрыта. Прохладный! Вы не знаете, пока не проверите его с помощью CURL или какого-нибудь другого инструмента и не заметите это огромное отверстие безопасности.
Джанго иногда слишком много магии ....
Пример:
views.py
@authentication_classes((ExpiringTokenAuthentication, SessionAuthentication))
@permission_classes((IsOwnerOrReadOnly,))
class UserFavouritesSpotDetail(RetrieveUpdateDestroyAPIView):
model = UsersSpotsList
serializer_class = FavouritesSpotsListSerializer
def get_queryset(self):
queryset = UsersSpotsList.objects.filter(
role=1)
return queryset
def get_object(self):
queryset = self.get_queryset()
obj = get_object_or_404(
queryset,
pk=self.kwargs['pk'],
role=1)
self.check_object_permissions(self.request, obj)
return obj
Обратите внимание решающая линия упоминается Shivansh:
self.check_object_permissions(self.request, obj)
Когда Мне не хватало этой уязвимости существовал.
permissions.py
from rest_framework import permissions
class IsOwnerOrReadOnly(permissions.BasePermission):
"""
Object-level permission to only allow owners of an object to edit it.
Assumes the model instance has an `user` attribute.
"""
def has_object_permission(self, request, view, obj):
# Read permissions are allowed to any request,
# so we'll always allow GET, HEAD or OPTIONS requests.
if request.method in permissions.SAFE_METHODS:
return True
return obj.user == request.user
TEST она с http://www.getpostman.com/
например
обеспечивают ЗНАК пользователь не владеющим объект.
Если все в порядке, вы должны увидеть «деталь»: «У вас нет разрешения на выполнение этого действия."
Спасибо за этот ответ !!! – andi