对Django的担忧';s内容类型安全性
我开始使用Django的内容类型来实现项目中各种应用程序的解耦,我一直很喜欢。但是,有件事让我担心:安全 我使用的方法是通过GET传递对Django的担忧';s内容类型安全性,django,django-contenttypes,Django,Django Contenttypes,我开始使用Django的内容类型来实现项目中各种应用程序的解耦,我一直很喜欢。但是,有件事让我担心:安全 我使用的方法是通过GET传递content\u type和object\u id的参数。现在,这已经足够了,因为在我的网站上,所有东西都是公开的 但让我担心的是,当我想到我的网站的私有部分时,一个用户改变另一个用户的URL访问信息的可能性。我想了很多办法来避免这个问题,但我不确定。通过POST而不是GET传递这些信息似乎是可以做的第一件事,但这只能绕过真正的问题。另外,我认为在测试登录用户的
content\u type
和object\u id
的参数。现在,这已经足够了,因为在我的网站上,所有东西都是公开的
但让我担心的是,当我想到我的网站的私有部分时,一个用户改变另一个用户的URL访问信息的可能性。我想了很多办法来避免这个问题,但我不确定。通过POST而不是GET传递这些信息似乎是可以做的第一件事,但这只能绕过真正的问题。另外,我认为在测试登录用户的权限时,由于我处理的是泛型关系,所以验证权限所需的测试类型并不明显。可能是使用cookies或上下文变量的东西
所以,我想问你们是如何在这些案例中使用内容类型的。我真的错过了一些关于如何正确使用这一令人敬畏的功能的好例子
有什么帮助吗?答案在很大程度上取决于您的型号和应用程序。您到底是如何使用内容类型框架的 一般来说,建议有一个额外的抽象层来控制内容类型框架的使用 例子 让我构造一个例子。假设您有以下模型:门户、立方体和蛋糕
Portal
和Cube
是公共的,而Cake
对于具有特定权限的用户是私有的
据我所知,你的方法是这样的:
# gets called via GET with parameters content_type_id and object_id
def modify_object(request, content_type_id, object_id)
content_type = ContentType.objects.get_for_id(content_type_id)
model_class = content_type.model_class()
instance = model_class.objects.get(pk=object_id)
# modify instance - could also be a "Cake"
instance.save()
如果只允许修改某些类型的对象,则此漏洞很容易受到攻击。您可以为content_类型添加一个检查,但这似乎不是非常复杂和巧妙的设计
相反,我会选择一种不那么通用的方法。为模型上要允许用户执行的每个不同任务定义方法:
def create_portal(request, object_id):
portal = Portal.objects.get(pk=object_id)
# create the portal
portal.save()
def carry_cube(request, object_id):
# load, move the cube and save
@permission_required('cake.can_eat')
def eat_cake(request, object_id):
# this will only be performed if the current user has the required permissions
# load, eat the delicious cake and save
希望这些信息是有用的。有了你方更多的投入,就更容易给出更详细的答案。这与内容类型无关。即使所有内容都在一个模型中,更改URL也将允许您访问其他数据,除非您实现某种授权。