2009-10-30 19 views
54

django csrf中間件無法禁用。我從我的項目中間件中評論了我的項目,但由於缺少CSRF問題,我的登錄失敗。我正在從Django主幹工作。如果CSRF在中間件中未啓用,CSRF如何引發問題?Django CSRF框架無法被禁用,正在破壞我的網站

我必須禁用它,因爲我的站點上有很多POST請求,CSRF只是中斷。任何關於如何在Django主幹項目中完全禁用CSRF的反饋?

Django中繼的「新」CSRF框架也打破了一個外部網站,它正在對我給予的URL(這是一個restful API的一部分)進行POST。我無法禁用在CSRF框架正如我剛纔所說,我怎麼能解決這個問題?

+0

接受正確的答案,請從 – necromancer 2013-08-09 03:59:35

+0

的@shreddd答案很可能比接受的答案一個更好的選擇。 – boatcoder 2013-12-10 02:27:55

回答

11

查看下面的答案以獲得更好的解決方案。自從我寫這篇文章以來,很多變了。現在有更好的方法來禁用CSRF。

我感到你的痛苦。改變這種基本功能的框架是不可接受的。即使我想從現在開始使用它,我在同一臺計算機上共享遺留站點共享django的副本。像這樣的更改應該需要主版本號修訂。 1.x - > 2.x.

無論如何,要解決它我只是評論它,並已經停止更新Django。

文件:Django的/中間件/ csrf.py 圍繞線160:

  # check incoming token 
#   request_csrf_token = request.POST.get('csrfmiddlewaretoken', None) 
#   if request_csrf_token != csrf_token: 
#    if cookie_is_new: 
#     # probably a problem setting the CSRF cookie 
#     return reject("CSRF cookie not set.") 
#    else: 
#     return reject("CSRF token missing or incorrect.") 
+1

多年過去了,但評論這部分對我來說似乎仍然是最佳選擇。其他解決方案通常適用於一些情況,但不是全部情況 – Drachenfels 2016-05-23 15:15:01

6

一般情況下,你不應該禁用CSRF保護,因爲這樣打開了安全漏洞。如果你堅持,雖然...

新最近做CSRF保護的方法降落在後備箱中,你的站點是否仍舊配置成舊的方式?這裏有the docs for The New Way™,這裏是docs for The Old Way™

+1

感謝您的信息,您沒有告訴我如何完全禁用CSRF,我有一個生產網站已停止爲付款客戶工作,因爲我被這種「新」做法向後兼容的做法所掩蓋。但這是導致問題的問題,我正在努力快速更新爲新/傳統方式。 – MikeN 2009-10-30 17:08:12

+0

下面是開發人員郵件列表中的一些討論:http://groups.google.com/group/django-developers/browse_thread/thread/ac771d10d58340cb 也許這將有助於禁用/更新。 – 2009-10-30 17:47:12

+0

有一個視圖裝飾器使用:@csrf_exempt,如果你把這個裝飾器的CSRF框架將忽略它的檢查請求。我很惱火這個CSRF陷阱是如何發生的,它被燒入auth框架,所以如果你使用auth登錄,你不能禁用它。 – MikeN 2009-10-30 18:05:58

125

是,Django的CSRF框架可以被禁用。

要手動排除任何CSRF中間件處理的視圖函數,可以使用django.views.decorators.csrf模塊中的csrf_exempt修飾符。例如:(see doc

from django.views.decorators.csrf import csrf_exempt           
@csrf_exempt                     
def my_view:                    
    return Httpresponse("hello world") 

..和然後從模板中刪除{% csrf_token %}表格內,或留下其他的東西不變,如果你還沒有在你的表單包含它。

+1

+1更好地使用規定的方法來選擇性地關閉它,而不是在任何地方關掉! – Seth 2010-07-19 20:01:37

+2

很好的答案,它需要更多upvotes – GDR 2010-10-21 11:44:22

+2

我同意這應該是接受的答案。一般來說,當API已經提供你需要的功能時,不要破解它。 – 2010-11-29 16:59:00

4

我只是嘗試從我的settings.py中刪除對csrf中間件類的引用,它工作。不知道這是否可以接受。任何意見? 下面兩行被刪除 -

 'django.middleware.csrf.CsrfViewMiddleware', 
     'django.middleware.csrf.CsrfResponseMiddleware', 
+0

好吧,明白了。它打破了我的管理員的東西,所以,補丁解決方案似乎是最好的(雖然沒有嘗試過)。 – Yateen 2010-11-13 11:49:51

+0

沒有爲我工作。 – Bryce 2012-06-24 22:46:43

81

您可以在中間件中禁用此功能。

在您的settings.py添加一行到MIDDLEWARE_CLASSES:

MIDDLEWARE_CLASSES = (

    myapp.disable.DisableCSRF, 

) 

創建禁用。PY在MYAPP與以下

class DisableCSRF(object): 
    def process_request(self, request): 
     setattr(request, '_dont_enforce_csrf_checks', True) 

基本上,如果你設置你的要求_dont_enforce_csrf_checks,你應該確定。

+0

謝謝!正是我需要的。我使用Django的評論系統,但由於包含表單的頁面被緩存,所以csrf驗證不起作用。 – 2011-04-07 12:47:28

+1

這是爲整個網站禁用csrf的最好方法,很簡單。要選擇性地禁用,這不是問題,那麼你可以使用關於@csrf_exempt的其他答案 – Pykler 2011-10-04 18:03:08

+0

這個是其中的一個,以前的其他答案太籠統了,或者只是掩蓋了csrf視圖失敗的事實。這一個正確地禁用某些應用程序,沒有掩蓋失敗... – 2011-12-29 17:51:25

0

我的django版本是1.11。中間件應該是這樣的:

from django.utils.deprecation import MiddlewareMixin 


class DisableCSRF(MiddlewareMixin): 
    def process_request(self, request): 
     setattr(request, '_dont_enforce_csrf_checks', True)