Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对Django的担忧';s内容类型安全性_Django_Django Contenttypes - Fatal编程技术网

对Django的担忧';s内容类型安全性

对Django的担忧';s内容类型安全性,django,django-contenttypes,Django,Django Contenttypes,我开始使用Django的内容类型来实现项目中各种应用程序的解耦,我一直很喜欢。但是,有件事让我担心:安全 我使用的方法是通过GET传递content\u type和object\u id的参数。现在,这已经足够了,因为在我的网站上,所有东西都是公开的 但让我担心的是,当我想到我的网站的私有部分时,一个用户改变另一个用户的URL访问信息的可能性。我想了很多办法来避免这个问题,但我不确定。通过POST而不是GET传递这些信息似乎是可以做的第一件事,但这只能绕过真正的问题。另外,我认为在测试登录用户的

我开始使用Django的内容类型来实现项目中各种应用程序的解耦,我一直很喜欢。但是,有件事让我担心:安全

我使用的方法是通过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也将允许您访问其他数据,除非您实现某种授权。