【问题标题】:Django Forms - Is 'readonly' safe to use?Django Forms - 'readonly' 可以安全使用吗?
【发布时间】:2019-07-22 13:41:46
【问题描述】:

我在 Django 中创建了一个表单。在这个表单中,有一个字段不能由用户编辑,因为表单的默认值必须按原样发送到我的数据库。我想出了以下解决方案,但经过一些研究,我发现使用readOnly 通常不是一个好主意。

有人可以澄清一下吗?我应该采用其他解决方案吗?

tst = forms.CharField(
        initial='//value to be sent to the db without being touched',

        widget=forms.TextInput(attrs={'readonly':'readonly'}))

【问题讨论】:

  • 所有必须安全的验证都应该在模型中完成(并且可能再次在表单中)。

标签: python django django-forms django-templates


【解决方案1】:

:因为这只是 client 端的一个属性。但是用户可以简单地绕过它。例如,在没有浏览器的情况下发出 POST 请求,或者通过操作 DOM 来更改 readonly 属性。

由于,您可以使用disabled=... 参数。这不仅会禁用 HTML 元素,还会省略具有该名称的 GET/POST 参数,如文档所述:

disabled 布尔参数,当设置为 True 时,使用禁用的 HTML 属性禁用表单字段,以便用户无法编辑它。即使如果用户篡改了提交给服务器的字段值,它也会被忽略,取而代之的是表单初始数据中的值

因此您可以使用以下方式实现您的表单:

class MyForm(forms.ModelForm):
    tst = forms.CharField(
        initial='//value to be sent to the db without being touched',
        disabled=True,
        widget=forms.TextInput)
    )

请注意,如果您只打算分配一个值,您应该从表单中省略该字段,并在模型中分配它。

【讨论】:

  • 是的,将它分配到模块上将是完美的解决方案。问题是我必须在同一页面中使用相同的表单两次。除了一个之外,所有字段都是通用的,这就是我将其设置为禁用的原因。第一个表单将有一个 X 禁用字段,第二个表单将有一个 Y 禁用字段
  • @Jack002:显然这取决于用例。在这里使用表单可能确实更好。
  • 那么,基本上使用 disabled 将是最安全的方法吗?我问是因为安全性是我正在从事的项目的一项重要功能
  • @Jack022:文档说:“禁用的布尔参数,当设置为 True 时,使用禁用的 HTML 属性禁用表单字段,这样用户就无法编辑它。甚至如果用户篡改了提交给服务器的字段值,它将被忽略,取而代之的是表单初始数据中的值。"。因此,鉴于 Django 中没有错误,确实应该如此。显然 Django 中存在错误(但可能不是针对此功能)。所以你永远不能“完全”相信这一点,但这至少是预期的行为。
猜你喜欢
  • 2019-09-18
  • 2018-03-20
  • 2010-10-11
  • 2013-01-06
  • 2016-04-28
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多