我的文章How I could delete any video on YouTube 的灵感,并要检查,如果在我的Django项目一切工作的安全,并在这里结束了。
这是非常重要的问题! 答案非常好。
的Django Rest Framework
使得假象,一切工作正常,当一个人通过浏览的API观点看它。
对象,验证用户拥有其中:
对象,它验证用户确实不拥有:
隐藏DELETE键会让你感觉,一切都很好。
您进行身份验证,删除按钮隐藏。 酷!除非您使用CURL或其他工具进行测试,否则您会不知情,并注意到这个巨大的安全漏洞。
Django是有时过多魔....
实施例:
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/
它e.g提供的用户不拥有令牌对象。
,如果一切正常,你应该看到“细节”:“您没有权限执行此操作。“
感谢您的回答! – andi 2015-04-04 22:23:54