2017-09-10 14 views
1

我正在爲我的項目使用django-1.10,我想o在我的項目中禁用CSRF檢查。爲此我做的是,我創建了CSRFDiable中間件,並在CommonMiddleWare之後將其添加到中間件中。這個過程在django 1.8中爲我工作,但在django 1.10中不起作用。我也嘗試刪除django.middleware.csrf.CsrfViewMiddleware,但它不適合我。中間件類是如下無法禁用django中的CSRF檢查1.10

class DisableCSRF(object): 

    def __init__(self, get_response): 
     self.get_response = get_response 

    def __call__(self, request): 
     return self.get_response(request) 

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


MIDDLEWARE = [ 

    'django.middleware.security.SecurityMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'common.middlewares.DisableCSRF', 

    # 'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
    ] 

我對POST要求得到的錯誤是

{ 
    "detail": "CSRF Failed: CSRF token missing or incorrect." 
} 
+0

請參閱[此答案](https://stackoverflow.com/a/43841990/1418794) – doru

+0

爲什麼你甚至試圖禁用CSRF全球?如果禁用'CsrfViewMiddleware'不起作用,那麼您顯然使用'@ csrf_protect'的視圖。 _這些視圖需要CSRF保護!! _ – knbk

+0

'common.middlewares.DisableCSRF'的目的是什麼?您不應該添加任何中間件來禁用csrf。 –

回答

0

禁用csrf protection全球是不是一個好主意。但是如果你仍然想要爲基於rest-framework的API禁用CSRF,那麼你可以做的只是覆蓋SessionAuthenticationdjango-rest-framework,將其添加到django-rest-frameworkDEFAULT_AUTHENTICATION_CLASSES設置中,然後完成。你可以做這樣的

from rest_framework.authentication import SessionAuthentication 

class CsrfExemptSessionAuthentication(SessionAuthentication): 

    def enforce_csrf(self, request): 
     return # it will not perform any csrf check 

,並在您設置rest_framework添加

REST_FRAMEWORK = { 
'DEFAULT_AUTHENTICATION_CLASSES': (
'path of .CsrfExemptSessionAuthentication', # path of CsrfExemptSessionAuthentication class 
'rest_framework.authentication.BasicAuthentication' 
), 
} 

我希望它會爲你工作

或者你可以做的是使用token base authentication

+0

DRF在會話身份驗證中顯式檢查CSRF令牌的原因沒有提供禁用此檢查的方法。會話的設計固有地受到CSRF攻擊的影響。通過在使用會話身份驗證時禁用此檢查,您明確地使您的API容易受到CSRF攻擊。 **永遠不要在生產現場做這件事。** – knbk