有没有另一种方法来创建一个更安全的形式Django
问题描述:
我有一个关于在外形模型中使用hiddenfield的偏执狂。 我在向用户发送表单并隐藏它们之前初始化该值,并且当用户通过邮寄发回值时,我只需使用基本验证保存表单。 任何人都可以为隐藏的表单字段更改数据,或者更改数据并更改另一行中的数据? 还有另一种安全的方法吗?有没有另一种方法来创建一个更安全的形式Django
型号:
class company(models.Model):
user=models.ForeignKey(User)
comname=models.CharField(max_length=255)
regcode=models.CharField(max_length=128,blank=True,null=True)
320交织:
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))
答
你不应该依赖于浏览器向您发送相应的数据。请记住,它不是一个浏览器,它是Web应用程序的接口 - HTTP /另一个协议。将始终可以构建专门为您发送一些格式错误的数据的表单。更好 - 有人可以打开telnet终端并输入任何内容。
来自外部的任何数据都应被视为不可信,并应在服务器上进行验证。客户端验证对于用户来说只是一个方便的功能,绝不是安全措施。
在Django表单用于服务器端验证。但是,您无法对验证过程进行分区,并且假设数据一经验证就可以在客户端和服务器之间来回传输,并且仍然保持这种状态。如果要确保某些值在多个请求过程中保持不变,请使用服务器端的会话变量,因此不能被篡改。
答
我假设你想设置company.user
登录到一个currenlty并防止它被改变。你几乎是这样做的:
字段被排除在窗体之外,因为它应该是。然而,从长远来看,在表单声明中使用
fields
(白名单)比exclude
(黑名单)更安全。当字段被添加到有问题的模型时,这可以防止意外的副作用。-
为
user
初始值应提供,但有一个更好的方法 - 利用该ModelForm
使用的事实:{"form": CompanyForm(instance=Company(user=request.user))
,但以这种方式,发送到用户的数据,也许收到时会有所不同,也许在接收到发布数据并将其与用户发布的数据合并后有一种初始值的方法 – hosein 2011-04-24 18:36:18
这样就不会有'user_id'的隐藏表单字段,因此无法修改。你正在寻找这个安全吗? – 2011-04-25 02:42:25