1

我开始使用 Django 的 Content-Type 来允许在我的项目中解耦各种应用程序,我一直很喜欢。但是,让我担心的是:安全性。

我使用的方式是通过 GET 传递content_type和的参数object_id。现在,这就足够了,因为无论如何,我的网站上的所有内容都是公开的。

但是让我担心的是,在考虑我网站的私人部分时,一个用户可能会更改另一个用户的 URL 访问信息。我想了很多方法来避免这个问题,但我不确定。在 POST 而不是 GET 中传递它似乎是可以做的第一件事,但这只会绕过真正的问题。此外,我认为在测试登录用户的权限时,但由于我正在处理通用关系,因此验证权限所需的测试类型并不明显。也许使用 cookie 或上下文变量的东西......

所以,我想问你们是如何在这些情况下使用 Content-Type 的。我真的错过了一些很好的例子来说明如何以适当的方式使用这个很棒的功能。

有什么帮助吗?

4

1 回答 1

2

答案很大程度上取决于您的型号和应用。您究竟是如何使用内容类型框架的?

一般来说,建议有一个额外的抽象层来控制内容类型框架的使用。

例子

让我构建一个例子。假设您有这些模型:PortalCubeCakePortal并且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_type 的检查,但这似乎不是很复杂且设计巧妙。

相反,我会采用一种不太通用的方法。为您希望允许用户的模型上的每个不同任务定义方法:

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

希望这些信息对您有所帮助。有了更多来自您的意见,就更容易给出更详细的答案。

于 2013-05-29T00:16:55.297 回答