2009-11-19 77 views
6

我的站點上的CSRF Django中間件(SVN中繼版本)出現了很多故障。我得到的唯一錯誤是:CSRF故障:reason = CSRF令牌丟失或不正確。有很多故障的Django CSRF框架

我該如何診斷這些CSRF錯誤來自哪裏?我自己不能導致CSRF錯誤,但是當CSRF錯誤視圖被觸發時,我設置該網站給我發電子郵件,所以我知道它經常發生。

回答

15

我真的很努力,但最終做到了。這裏是我的主要問題(Django 1.2 beta):

  1. 根據您使用的Django版本,確保您的中間件是正確的。這在Django的在線文獻中有很好的介紹。
  2. 請確保您有{%csrf_token%}在每個表單中,只是下面的表格
  3. 這是我的主要問題開始標記,確保所有窗體有一個去到頁面,即不要't do action =「」在你的表格中。
  4. 確保您的設置電子郵件都是正確的。我不得不做這樣的事情:

    EMAIL_HOST = 'mail.my-domain.com' EMAIL_HOST_USER = EMAIL_HOST_PASSWORD = 'passwd文件' EMAIL_PORT '在服務器上我的用戶名'= '26' #似乎經常在論壇的很多帖子上,我都是25或26,我讀 DEFAULT_FROM_EMAIL='[email protected]'#在託管域名上,確保它已設置併發送 SERVER_EMAIL ='[email protected]'#與上述相同的電子郵件

  5. 的request_context加入您選擇render_to_response的端

return render_to_response('contact.htm',{'favicon':r'____。ico', 'more_stuff':「......」 'more_stuff':「......」 'more_stuff': 「......」 }, context_instance = RequestContext的(要求))

請確保您有:

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.contrib.auth.context_processors.csrf", 
    ..... 
    ) 
在你的settings.py

文件。

請注意,這真的不是一個如何,這正是我所做的工作。現在發佈它的原因是,我在討論這個主題的論壇上看到很多人訴諸關閉csrf_token。

+0

我在這裏試過一切,沒有運氣。據我所知,我正在做這本書的一切。 (Django 1.3)。任何人有任何其他想法?暫時關閉CSFR。 – araneae 2011-10-20 02:07:16

+0

我有類似的問題,並有許多形式的空行動網址。出於興趣,這是什麼原因導致問題?我可以看到這裏:http://stackoverflow.com/questions/1131781/is-it-a-good-practice-to-use-an-empty-url-for-a-html-forms-action-attribute-a它不在規範中,但我想知道它爲什麼會導致問題? – bjw 2012-08-17 10:43:34

+0

另外,@araneae沒有很好的理由關閉crsf保護是一個壞主意,這個評論可能會導致其他人也這樣做。唯一可以看到有必要關閉的情況是針對某些ajax場景,也可能是從Twilio等第三方API獲取POST數據。 – bjw 2012-08-17 11:18:39

2

當中間件成功停止跨站點請求僞造攻擊時,應發生CSRF錯誤。可能是驗證這種情況的最好方法是檢查您的Web服務器日誌,並且您應該看到與先前請求無關的請求。

+0

我似乎在所有發佈帖子並沒有特殊密鑰的公共頁面上獲得CSRF錯誤。我的解決方法是在所有公共視圖上使用disable_csrf裝飾器。 – MikeN 2009-12-20 15:40:01

0

請確保GET請求您的視圖功能是這樣的:

def login_view(): 
c = {} 
c.update(csrf(request)) 
request.session.set_expiry(0) 
if request.method == 'GET': 
    return render_to_response('newform.html',<b>c</b>) 

然後檢查查看源文件爲您newform.html,它必須有隱藏字段。

<`form action="" method="post" name="loginform"> <`div style='display:none'`><`input type='hidden' name='csrfmiddlewaretoken' value='6f4dee99ab2f5e7201e057cb63' /> 

在這裏,動作可以引用相同的頁面,action=""

1

另外,您應該檢查settings.py文件中MIDDLEWARE_CLASSES的順序。應該看起來像這樣:

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.locale.LocaleMiddleware', 
) 

LocaleMiddleware最後。 對我來說,解決方案是RequestContext實例和排序。