Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django表单集安全性_Django_Django Forms_Formsets - Fatal编程技术网

Django表单集安全性

Django表单集安全性,django,django-forms,formsets,Django,Django Forms,Formsets,我注意到Django表单集中有一些东西: 每个formset.form都有一个隐藏字段,其中包含正在编辑的模型的id。所有人需要做的就是更改这个id并提交,而默认的表单集clean()或save()方法不会引起注意 我认为跟踪原始表单集queryset中的对象并在保存时比较它们不会太复杂。我想知道为什么Django还没有这么做 至于我,我正在检查表单集保存的权限,如: if formset.is_valid(): for fs in formset: report = f

我注意到Django表单集中有一些东西:

每个formset.form都有一个隐藏字段,其中包含正在编辑的模型的id。所有人需要做的就是更改这个id并提交,而默认的表单集
clean()
save()
方法不会引起注意

我认为跟踪原始表单集queryset中的对象并在保存时比较它们不会太复杂。我想知道为什么Django还没有这么做

至于我,我正在检查表单集保存的权限,如:

if formset.is_valid():
    for fs in formset:
        report = fs.save(commit=False)
        if can_edit(request.user, report):
            report.save()

还有人注意到这个问题吗?我很想知道你是如何处理它的。

如果你有编辑其他对象的必要权限,那么Django为什么要阻止你这么做?HTTP请求是无状态的,因此当POST传入时,Django将检查是否允许您执行请求


因此,假设您已通过身份验证,并且有权更改
注释
对象。您的表单中有一条注释,其id=1。将隐藏字段更改为
id=2
,然后提交表单。Django将检查您的权限,并查看是否允许您更改任何
注释
实例并应用发布的更改。

据我所知,通过将隐藏id从
x
更改为
y
来编辑具有pk
y
(不在查询集中)的对象是不可能的。如果您发现了其他问题,我认为这是一个安全问题,最好私下报告,而不是在堆栈溢出上发布。我不认为当前缺少错误消息有什么具体原因-我认为补丁是受欢迎的。这是可能的(前提是
请求。用户
对模型具有编辑权限)。我刚试过。普通模型表单集根本不检查
请求。用户
。你说的是Django管理员吗?不,我说的是常规表单集。我以为Django在检查。那样的话,情况更糟。也许你是对的。但由于Django不附带对象级权限,这有点麻烦。例如,我可以很容易地确定表单集上的对象属于
请求。用户
,但这并不能提供任何保护。有很多方便的工具,如
is\u valid()
csrf\u令牌
和所需的
权限
装饰程序,这似乎是一个很好的方法来检查表单集是否被蒙骗了。与其说是Django,不如说是HTTP不起作用。您可以通过将所有
id
s放入一个字符串中,然后对其进行散列,并将散列发送给客户端来实现所需的功能。当客户端提交表单时,您可以再次获取提交的
id
s,对其进行散列,并比较两个散列。另一种方法是,将
id
s列表放入用户的会话对象中,并在收到表单时进行比较。但同样,这不是应该怎么做的。或者我可以在进入
if request.method==“POST”
条件之前保存queryset信息。然后提取ID并使用它们进行比较。