繁体   English   中英

担心Django的内容类型安全性

[英]Worries About Django's Content-Type Security

我开始使用Django的Content-Type来允许项目中各种Apps的分离,而我一直很喜欢。 但是,让我担心的是:安全性。

我使用的方式是通过GET传递的,这些参数是content_typeobject_id 现在,这已经足够了,因为无论如何,所有内容都可以在我的网站上公开获得。

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

因此,我想问一下在这些情况下你们如何使用Content-Type。 我确实缺少一些很好的示例,说明了如何以适当的方式使用此出色功能。

有什么帮助吗?

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

一般而言,建议有一个附加的抽象层来控制内容类型框架的使用。

让我构造一个例子。 假设您有以下模型: PortalCubeCake 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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM