还有另一种方法可以在django中创建更安全的表单

时间:2011-04-24 11:48:38

标签: django forms security validation

我对于使用外键模型中的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))

2 个答案:

答案 0 :(得分:2)

我假设您要将company.user设置为一个当前登录状态并阻止其被更改。你做的几乎是正确的:

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

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

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

答案 1 :(得分:1)

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

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

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