【问题标题】:Is there another way to create a more secure form in django有没有另一种方法可以在 django 中创建更安全的表单
【发布时间】:2011-04-24 11:48:38
【问题描述】:

我对在模型表单中使用隐藏字段作为外键有一种偏执。 我在将表单发送给用户以获取外键并隐藏它们之前初始化值 当用户通过邮寄发回值时,我只需使用基本验证保存表单。 任何人都可以出于恶意原因更改隐藏表单字段中的数据,或者更改数据并更改另一行中的数据吗? 还有其他安全的方法吗?

型号:

class company(models.Model):
user=models.ForeignKey(User)
comname=models.CharField(max_length=255)
regcode=models.CharField(max_length=128,blank=True,null=True)

来自:

class companyform(forms.ModelForm):

comname=forms.CharField(label=_("company name"),help_text=_("This name appear on top of forms and printed content"))

regcode=forms.CharField(label=_("Register code "),help_text=_("Registered code of organization in goverment"))

class Meta: 
    model=careunitgeneralsetting
    exclude = ('user',)

查看:

return render_to_response("home_them.html",{"form":unicode(companyform(initial="user":request.user.id)},context_instance=RequestContext(request))

【问题讨论】:

    标签: django forms security validation


    【解决方案1】:

    我假设您想将company.user 设置为登录的一种货币并防止它被更改。你做的几乎是对的:

    1. 字段应按原样从表单中排除。然而,从长远来看,在表单声明中使用fields(白名单)比使用exclude(黑名单)更安全。这可以防止在将字段添加到相关模型时出现意外的副作用。

    2. 应该提供user 的初始值,但还有更好的方法——利用ModelForm 被使用的事实:

      {"form": CompanyForm(instance=Company(user=request.user))

    【讨论】:

    • 但是通过这种方式,发送给用户的数据可能会在接收时发生变化,也许有一种方法可以在接收到的数据时初始值并将它们与用户发布的数据合并
    • 这样就没有user_id的隐藏表单域,所以不能修改。您正在寻找这种安全性吗?
    【解决方案2】:

    您永远不应依赖浏览器向您发送适当的数据。请记住,Web 应用程序的接口不是浏览器——HTTP / 其他协议才是。始终可以构建一个专门为您发送一些格式错误的数据的表单。更好的是——有人可以打开一个 telnet 终端并输入任何内容。

    任何来自外部的数据都应被视为不受信任,并应在服务器上进行验证。客户端验证只是用户方便的功能,绝不是安全措施。

    在 Django 中,表单用于服务器端验证。但是,您不能对验证过程进行划分,并假设一旦数据经过验证,它就可以在客户端和服务器之间来回传输并且仍然保持这种方式。如果您想确保某些值在多个请求过程中保持不变,请使用位于服务器端的会话变量,因此不会被篡改。

    【讨论】:

      猜你喜欢
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-11
      • 2014-01-10
      • 2011-05-15
      • 1970-01-01
      相关资源
      最近更新 更多