2011-04-24 74 views
0

我有一個關於在外形模型中使用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)) 

回答

1

你不應該依賴於瀏覽器向您發送相應的數據。請記住,它不是一個瀏覽器,它是Web應用程序的接口 - HTTP /另一個協議。將始終可以構建專門爲您發送一些格式錯誤的數據的表單。更好 - 有人可以打開telnet終端並輸入任何內容。

來自外部的任何數據都應被視爲不可信,並應在服務器上進行驗證。客戶端驗證對於用戶來說只是一個方便的功能,絕不是安全措施。

在Django表單用於服務器端驗證。但是,您無法對驗證過程進行分區,並且假設數據一經驗證就可以在客戶端和服務器之間來回傳輸,並且仍然保持這種狀態。如果要確保某些值在多個請求過程中保持不變,請使用服務器端的會話變量,因此不能被篡改。

2

我假設你想設置company.user登錄到一個currenlty並防止它被改變。你幾乎是這樣做的:

  1. 字段被排除在窗體之外,因爲它應該是。然而,從長遠來看,在表單聲明中使用fields(白名單)比exclude(黑名單)更安全。當字段被添加到有問題的模型時,這可以防止意外的副作用。

  2. user初始值應提供,但有一個更好的方法 - 利用該ModelForm使用的事實:

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

+0

,但以這種方式,發送到用戶的數據,也許收到時會有所不同,也許在接收到發佈數據並將其與用戶發佈的數據合併後有一種初始值的方法 – hosein 2011-04-24 18:36:18

+0

這樣就不會有'user_id'的隱藏表單字段,因此無法修改。你正在尋找這個安全嗎? – 2011-04-25 02:42:25

相關問題