担心Django的内容类型安全性

时间:2013-05-28 23:48:51

标签: django django-contenttypes

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

我正在使用的方式是通过GET传递content_typeobject_id的参数。就目前而言,这已经足够了,因为无论如何,我的网站上的所有内容都是公开的。

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

所以,我想问一下你们在这些案例中如何使用Content-Type。我真的错过了一些如何以正确的方式使用这个很棒的功能的好例子。

任何帮助?

1 个答案:

答案 0 :(得分:2)

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

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

实施例

让我构建一个例子。假设您有这些模型:门户多维数据集蛋糕PortalCube是公开的,而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

希望这些信息有用。有了更多的意见,您可以更轻松地提供更详细的答案。