我是Django的新手。昨天晚上,我努力工作,让我可以编辑当前项目中的任何实体;章节,故事和世界。为了确保我确切地知道哪个数据库对象正在被修改,我添加了一个数据库条目到存储散列的表的'编辑'中,被编辑的对象的类型(例如,'章节')和那个ID对象在数据库中找到。散列作为隐藏输入添加到表单中。Django的update_object通用视图是否安全?我应该扩展它还是为了安全而自己创建?
在后端,表单提交后,我抓取散列并使用它来查找数据库中相关的Edit项。然后我使用它来查找最初正在编辑哪个对象。这是由于两个原因:
我可以知道什么对象是真正被编辑。如果所有表单项目都发生了变化,那么就没有什么可比较的(除了URL)来真正知道正在编辑哪个对象。
用户应该无法破解前端做奇怪的事情,如修改错误的故事。
今天我发现Django有一个通称为update_object
的视图。这似乎为我处理了很多事情。但考虑到它不会自动使用数据库来确保正在编辑正确的对象,或者甚至确定正在编辑哪个对象,这是否安全?当然,必须通过修改HTML元素来在前端创建一个简单的方法。其次,如果这应该是一个问题,你会建议我保留自己的编辑视图,还是扩展update_object视图或其他解决方案?
最后,我是否正确地做这件事?如果我没有以正确的方式考虑解决这个问题,请纠正我。
我不认为这是一个需要编码的问题。与Django有关的表单的安全性更像是一个普遍的问题。
感谢,
ParagonRG
谢谢,我没有注意到那些通用视图已被弃用!我将不得不乱用UpdateView。另外,有趣的是,我没有看到隐藏的表单元素,指出哪个对象正在编辑。看看这里(很短):http://dpaste.com/733945/。这是一个世界对象,它的ID是1.没有其他可以识别的东西,而且我也没有看到那个代码。没有它,它怎么会起作用? – Paragon 2012-04-18 21:50:09
@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
非常有帮助,谢谢。这使我的思想走上正轨。 – Paragon 2012-04-18 22:01:08