0

我是 Django 的新手。昨晚我努力开发了一个视图,该视图允许我编辑当前项目中的任何实体;章节、故事和世界。为了确保我准确地知道正在修改哪个数据库对象,我在表“编辑”中添加了一个数据库条目,该表存储了哈希、正在编辑的对象的类型(例如“章节”)以及该对象的 id在数据库中找到的对象。哈希作为隐藏输入添加到表单中。

在后端,提交表单后,我抓取哈希并使用它在数据库中查找相关的编辑项。然后我使用它来查找最初正在编辑的对象。这样做有两个原因:

  1. 我可以知道真正正在编辑的对象是什么。如果所有表单项都已更改,则没有什么可以比较(除了 URL)来实际知道正在编辑的对象。

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

今天我发现 Django 有一个通用视图,叫做update_object. 这似乎为我处理了很多事情。但鉴于它不会自动使用数据库来确保正在编辑正确的对象,甚至不会确定正在编辑对象,这是否安全?肯定有一种简单的方法可以在前端通过修改 HTML 元素来破解它。

其次,如果这值得关注,您会建议我保留自己的编辑视图,还是扩展 update_object 视图,或其他解决方案?

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

我不觉得这是一个需要代码的问题。这更像是一个关于表单安全性的一般性问题,因为它们与 Django 相关。

谢谢,

典范RG

4

1 回答 1

1

您知道他们正在编辑哪个对象的问题通常可以通过检查 URL 或仅具有数据库 ID 的隐藏表单元素来解决。

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

如果您采用这种方法,我看不出有任何理由说明用户可能正在编辑隐藏的 ID 字段以假装正在编辑不同的对象。当他们本可以转到不同的编辑链接时,他们只是使用一种愚蠢的迂回方式来编辑内容。

(另外:如果您使用的是 Django 1.3+,最好使用新的基于类UpdateView而不是基于函数的update_object.)

于 2012-04-18T21:29:20.717 回答