我对于使用外键模型中的hiddenfield感到妄想。 我在将表单发送给用户的外键之前初始化该值并隐藏它们 当用户通过邮寄发回值时,我只需使用基本验证保存表单。 任何人都可以出于恶意原因更改隐藏表单字段中的数据,还是更改数据并更改另一行中的数据? 还有另一种安全方式吗?
模型:
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))
答案 0 :(得分:2)
我假设您要将company.user
设置为一个当前登录状态并阻止其被更改。你做的几乎是正确的:
字段应该从表单中排除。但是,从长远来看,在表单声明中使用fields
(白名单)比exclude
(黑名单)更安全。当字段添加到相关模型时,这可以防止意外的副作用。
应提供user
的初始值,但有更好的方法 - 利用ModelForm
使用的事实:
{"form": CompanyForm(instance=Company(user=request.user))
答案 1 :(得分:1)
您永远不应该依赖浏览器向您发送适当的数据。请记住,它不是一个浏览器,它是您的Web应用程序的接口 - HTTP /其他协议。始终可以构建一个专门为您发送错误数据的表单。更好的是 - 有人可以打开一个telnet终端并输入任何内容。
来自外部的任何数据都应被视为不受信任,并应在服务器上进行验证。客户端验证只是用户的一个方便功能,绝不是安全措施。
在Django表单中用于服务器端验证。但是,您无法对验证过程进行分区,并假设一旦数据经过验证,它就可以在客户端和服务器之间来回传输,并且仍然保持这种状态。如果要确保某些值在多个请求过程中保持不变,请使用服务器端的会话变量,因此不能被篡改。