2009-11-28 61 views
3

在測試我用Django編寫的應用程序時,我發現每次提交表單時都會出現HTTP 403 Forbidden錯誤。我知道CSRF中間件使用CSRF令牌檢查cookie,但我的方法應該給予禁用cookie的用戶的方法?Django CSRF問題,禁用了Cookie

我是否需要檢查用戶是否在我的每個視圖中啓用了Cookie,或者是否存在更有效的方法?

在此先感謝。

Django 1.2之前的這個問題 - 如果你有一個老版本的解決方案是不同的。

回答

1

從Django 1.2開始,您可以使用CSRF_FAILURE_VIEW覆蓋403響應。

+0

是的,這是一個很好的觀點。這個問題在1.2之前,但對於那些現在偶然發現的人來說,這很好,正如你顯然擁有的那樣。 – Rubix 2011-03-08 18:58:55

0

如果表單真的必須沒有cookies,我認爲你只需要禁用CSRF中間件。您可以使用兩個表單輸入來實現類似的事情,其中​​一個的值是隨機的,另一個是第一個和一個祕密的散列。

+0

我剛纔發現,如果用戶收到一條通知,表示他們沒有啓用cookie而不是一個醜陋的403錯誤,那就太好了。 – Rubix 2009-12-02 09:30:56

0

您是否嘗試將csrf信息作爲隱藏POST變量傳遞?在我曾參與IT項目通常與一個隱藏的輸入來完成:

<input type="hidden" name="csrf" value="<?=$person->csrf?>" /> 

對不起,PHP代碼,我不記得如何做到這一點在Django模板。

+0

在Django中,變量是通過模板標籤處理的。我擔心的是顯示的403錯誤頁面引用了CSRF錯誤,我根本無法自定義它。我認爲解決這個問題的最佳方法是在處理任何視圖之前檢查cookie,但我已經提出了一個「make-do」解決方案。 – Rubix 2009-12-06 11:34:14

1

只是任何人誰具有相同的問題:我發現對我來說,最適合的解決方案是寫一些中間件顯示通用的403錯誤頁面:

from django.http import HttpResponseForbidden 
from django.conf import settings 

from django.template import RequestContext 
from django.shortcuts import render_to_response 

class PermissionErrorMiddleware(object): 
    def process_response(self, request, response): 
     if isinstance(response, HttpResponseForbidden): 
      return render_to_response('403.html', context_instance=RequestContext(request)) 

     return response 

它指示用戶認爲最有可能的原因因爲錯誤頁面是cookies被禁用(等等),因爲我的應用程序不會真的拋出403錯誤,否則。我一直傾向於「安全通過隱藏」方法,並且在用戶不應訪問特定頁面時拋出404錯誤。