2015-11-04 44 views
0

我有一個關於Django Forms和GET的問題在Django表中使用GET

我有一個表格來下載CSV格式的學生成績。該字段的名字和年份,所以我有一個forms.py

StudentDownloadForm(forms.Form): 
    name=forms.CharField() 
    year = forms.CharField() 

而且我想在template.html使用這種形式與

context={'student_form' : StudentDownloadForm(),}

<form action ="" method="GET"> 
    {% csrf_token %}{{ student_form|crispy }} 
<input type="submit" value="Query"/> 
</form> 

所以我的問題如下:

  • 如果我使用method="GET",那麼csrf令牌在URL中是可見的,這是一個安全問題
  • 然後我可以用method="POST"代替嗎?
  • 或者,我可以刪除表單中的csrf標記嗎?
+0

一個GET不需要CSRF令牌。 –

回答

2

根據Django文檔(Cross Site Request Forgery protection):

對於那些所有傳入請求不使用HTTP GET,HEAD,OPTIONS 或跟蹤,一個CSRF餅乾必須存在,而' 'csrfmiddlewaretoken' 字段必須存在且正確。如果不是,用戶將得到一個 403錯誤。

和:

它故意忽略GET(即是由 RFC 2616定義爲「安全」和其他請求)請求。這些請求不應該有任何潛在的危險副作用,因此CSRF攻擊與GET請求應該是無害的。 RFC 2616將POST,PUT和DELETE定義爲 '不安全',並且所有其他方法都被假定爲不安全的,以便最大限度地保護。

所以,你可以省略CSRF令牌GET requiests

+1

你可以,但你必須確保你堅持標準和[不要使用GET來處理「不安全」請求](http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html)。 – SilverlightFox