在DRF框架中暴露条目ID的风险

2024-05-13 00:12:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个API,并开始使用GenericAPIViews。在这个例子中

class InsertActivityChange(UpdateAPIView):
    authentication_classes = []
    permission_classes = []
    serializer_class = ActivitiesSerializer
    lookup_field = 'id'

    def get_queryset(self):
        return Activities.objects.filter(id=self.kwargs['id'])
        
    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

path('insertactivitychange/<int:id>', views.InsertActivityChange.as_view(), name='insertactivitychange'),

我使用了一个泛型类来更新对象。我担心的是,如果允许在URL之后直接输入ID,是否会冒很大风险。显然,我会通过正确配置身份验证和权限类来进一步降低风险,因此条目的ID甚至是安全风险吗


Tags: selfapiidreturnrequestdefargskwargs
2条回答

如果您担心访问,请记住添加权限和筛选器。如果你专注于安全和隐藏资源,确保它们将是404而不是401或403。请看一下DRF filtering部分,在序列化程序中使用PrimaryKeyRelatedField{},您可以根据user进行筛选

如果您担心暴露pk,只需使用uuid。它仍然可见,但人类无法预测下一个id是什么

所以,即使第三方知道资源的id,如果您想隐藏资源,它也应该返回404。这样你就向攻击者暴露了一个毫无意义的值

让我试着回答这个问题

One can't ensure security just by hiding things

每当我问类似的问题时,我的一位导师总是强调这一点

为了回答您的问题,据我说,不,您不会通过公开ID来暴露任何安全缺陷,事实上,这是允许用户通过API与资源交互的最常见方式之一

您肯定需要有适当的身份验证和授权,以保护恶意来源对资源的操纵。在DRF和django的上下文中,您可以通过使用身份验证和权限来实现这一点

希望这能回答你的问题

相关问题 更多 >