2012-04-18 72 views
0

我是Django的新手。昨天晚上,我努力工作,让我可以编辑当前项目中的任何实体;章节,故事和世界。为了确保我确切地知道哪个数据库对象正在被修改,我添加了一个数据库条目到存储散列的表的'编辑'中,被编辑的对象的类型(例如,'章节')和那个ID对象在数据库中找到。散列作为隐藏输入添加到表单中。Django的update_object通用视图是否安全?我应该扩展它还是为了安全而自己创建?

在后端,表单提交后,我抓取散列并使用它来查找数据库中相关的Edit项。然后我使用它来查找最初正在编辑哪个对象。这是由于两个原因:

  1. 我可以知道什么对象是真正被编辑。如果所有表单项目都发生了变化,那么就没有什么可比较的(除了URL)来真正知道正在编辑哪个对象。

  2. 用户应该无法破解前端做奇怪的事情,如修改错误的故事。

今天我发现Django有一个通称为update_object的视图。这似乎为我处理了很多事情。但考虑到它不会自动使用数据库来确保正在编辑正确的对象,或者甚至确定正在编辑哪个对象,这是否安全?当然,必须通过修改HTML元素来在前端创建一个简单的方法。其次,如果这应该是一个问题,你会建议我保留自己的编辑视图,还是扩展update_object视图或其他解决方案?

最后,我是否正确地做这件事?如果我没有以正确的方式考虑解决这个问题,请纠正我。

我不认为这是一个需要编码的问题。与Django有关的表单的安全性更像是一个普遍的问题。

感谢,

ParagonRG

回答

1

你知道的问题,哪个对象,他们正在编辑或者通过检查URL或只是对数据库ID一个隐藏的表单元素通常被解决。

在接受用户表单的任何更改之前,您应该验证用户是否有权执行他们要求的任何操作,并且这些编辑是有意义的。您通常会在视图中使用表单验证器和/或显式检查来执行此操作。这是处理这个问题的一种更安全的方式,因为它可以保证人们不会进行数据库更改而不允许他们进行数据库更改,而在您的对象方法中,可以想象他们可以解决这个问题。

如果你采取这种方法,我看不出有什么理由为什么这是一个问题,用户可能会编辑隐藏的ID字段来假装编辑不同的对象。当他们可能刚刚进入不同的编辑链接时,他们只是用一种愚蠢的迂回方式来编辑内容。 (另外:如果您使用的是Django 1.3+,最好使用新的基于类的UpdateView,而不是基于函数的update_object。)

+0

谢谢,我没有注意到那些通用视图已被弃用!我将不得不乱用UpdateView。另外,有趣的是,我没有看到隐藏的表单元素,指出哪个对象正在编辑。看看这里(很短):http://dpaste.com/733945/。这是一个世界对象,它的ID是1.没有其他可以识别的东西,而且我也没有看到那个代码。没有它,它怎么会起作用? – Paragon 2012-04-18 21:50:09

+1

@Paragon我想它使用的是URL而不是一个隐藏的ID,这非常相似。碰巧,你可以在这里看到视图的来源(https://github.com/django/django/blob/master/django/views/generic/edit.py);如果你追溯到继承的痕迹,它会在[this method](https://github.com/django/django/blob/master/django/views/generic/detail.py#L19)中找到基于对象的对象在'pk'或'slug'或URL模式中的任何参数上。 – Dougal 2012-04-18 21:56:15

+0

非常有帮助,谢谢。这使我的思想走上正轨。 – Paragon 2012-04-18 22:01:08

相关问题