【问题标题】:Unable to disable CSRF check in django 1.10无法在 django 1.10 中禁用 CSRF 检查
【发布时间】:2017-09-10 13:46:11
【问题描述】:

我在我的项目中使用 django-1.10,我想在我的项目中禁用 CSRF 检查。为此,我所做的是我创建了一个 CSRFDiable 中间件并将其添加到 CommonMiddleWare 之后的中间件中。同样的过程在 django 1.8 中对我有用,但在 django 1.10 中它不起作用。我也尝试删除django.middleware.csrf.CsrfViewMiddleware,但它对我不起作用。中间件类如下

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."
}

【问题讨论】:

  • 你为什么还要尝试全局禁用 CSRF?如果禁用CsrfViewMiddleware 不起作用,那么您显然正在使用带有@csrf_protect 的视图。 这些视图需要 CSRF 保护!!
  • common.middlewares.DisableCSRF 的目的是什么?您不必添加任何中间件来禁用 csrf。
  • @knbk,我使用的是django-rest-framework's generic views,我不认为它默认使用@csrf_protect 装饰器。
  • @HåkenLid,我正在创建一些 api,我不需要 csrf_token,所以我禁用它。

标签: python django


【解决方案1】:

全局禁用csrf protection 不是一个好主意。但是,如果您仍然想为基于 rest-framework 的 API 禁用 CSRF,那么您可以做的只是覆盖 django-rest-frameworkSessionAuthentication 类,将其添加到 django-rest-framework DEFAULT_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

【讨论】:

  • DRF 在会话身份验证中显式检查 CSRF 令牌而不提供禁用此检查的方法是有原因的。会话在设计上天生就容易受到 CSRF 攻击。通过在使用会话身份验证时禁用此检查,您明确地使您的 API 容易受到 CSRF 攻击。 永远不要在生产站点中这样做。
猜你喜欢
  • 1970-01-01
  • 2017-05-28
  • 2019-03-25
  • 1970-01-01
  • 2019-01-16
  • 2017-05-26
  • 2017-07-03
  • 1970-01-01
  • 2015-03-18
相关资源
最近更新 更多