我开始使用Django的Content-Type来允许我的项目中各种应用程序的解耦,我一直很喜欢。但是,有些事让我担心:安全。
我正在使用的方式是通过GET传递content_type
和object_id
的参数。就目前而言,这已经足够了,因为无论如何,我的网站上的所有内容都是公开的。
但是担心我,在考虑我的网站的私有部分时,一个用户的可能性,更改另一个用户的URL访问信息。我想了很多选择,试图避免这个问题,但我不确定。在POST中传递这个而不是GET似乎是第一件可以完成的事情,但那只会绕过真正的问题。此外,我在测试登录用户的权限,但由于我正在处理通用关系,因此验证权限所需的测试类型并不明显。也许是使用cookie或上下文变量的东西......
所以,我想问一下你们在这些案例中如何使用Content-Type。我真的错过了一些如何以正确的方式使用这个很棒的功能的好例子。
任何帮助?
答案 0 :(得分:2)
答案很大程度上取决于您的型号和应用。你究竟是如何使用内容类型框架的呢?
一般来说,建议有一个额外的抽象层来控制内容类型框架的使用。
让我构建一个例子。假设您有这些模型:门户,多维数据集和蛋糕。 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_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
希望这些信息有用。有了更多的意见,您可以更轻松地提供更详细的答案。