如何禁用Django的CSRF验证?

时间:2013-05-09 09:07:09

标签: python django

我在settings.py中注释掉了csrf处理器和中间件行:

122 
123 TEMPLATE_CONTEXT_PROCESSORS = (
124     'django.contrib.auth.context_processors.auth',
125 #    'django.core.context_processors.csrf',
126     'django.core.context_processors.request',
127     'django.core.context_processors.static',
128     'cyathea.processors.static',
129 )
130 
131 MIDDLEWARE_CLASSES = (
132     'django.middleware.common.CommonMiddleware',
133     'django.contrib.sessions.middleware.SessionMiddleware',
134 #    'django.middleware.csrf.CsrfViewMiddleware',
135     'django.contrib.auth.middleware.AuthenticationMiddleware',
136     'django.contrib.messages.middleware.MessageMiddleware',
137     'django.middleware.locale.LocaleMiddleware',
138     # Uncomment the next line for simple clickjacking protection:
139     # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
140 )

但是当我使用Ajax发送请求时,Django仍然会响应'csrf令牌不正确或丢失',并且在将X-CSRFToken添加到头文件后,请求将成功。

这里发生了什么?

8 个答案:

答案 0 :(得分:184)

如果您只是需要一些不使用CSRF的观点,可以使用@csrf_exempt

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def my_view(request):
    return HttpResponse('Hello world')

您可以在此处找到更多示例和其他方案:

答案 1 :(得分:25)

要为基于类的视图禁用CSRF,以下内容对我有用 使用django 1.10和python 3.5.2

from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator

@method_decorator(csrf_exempt, name='dispatch')
class TestView(View):
    def post(self, request, *args, **kwargs):
        return HttpResponse('Hello world')

答案 2 :(得分:10)

答案可能不合适,但我希望它可以帮助你

class DisableCSRFOnDebug(object):
    def process_request(self, request):
        if settings.DEBUG:
            setattr(request, '_dont_enforce_csrf_checks', True)

拥有这样的中间件有助于调试请求并检查生产服务器中的csrf。

答案 3 :(得分:9)

对于 Django 2

from django.utils.deprecation import MiddlewareMixin


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

必须在适当时(例如,在测试设置中)将中间件添加到settings.MIDDLEWARE

注意:该设置不再被称为MIDDLEWARE_CLASSES

答案 4 :(得分:8)

在MIDDLEWARE的setting.py中,您只需删除/评论此行:

'django.middleware.csrf.CsrfViewMiddleware',

答案 5 :(得分:4)

这里的问题是SessionAuthentication执行自己的CSRF验证。这就是为什么即使在CSRF中间件被评论时也会出现CSRF丢失错误的原因。 您可以将@csrf_exempt添加到每个视图,但如果要禁用CSRF并对整个应用程序进行会话身份验证,则可以添加这样的额外中间件 -

class DisableCSRFMiddleware(object):

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

def __call__(self, request):
    setattr(request, '_dont_enforce_csrf_checks', True)
    response = self.get_response(request)
    return response

我在myapp / middle.py中创建了这个类 然后在settings.py

中的Middleware中导入此中间件
MIDDLEWARE = [
    'django.middleware.common.CommonMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    #'django.middleware.csrf.CsrfViewMiddleware',
    'myapp.middle.DisableCSRFMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',

]

适用于django 1.11上的DRF

答案 6 :(得分:1)

CSRF可以在视图级别强制执行,无法全局禁用

在某些情况下,这是一种痛苦,但是,嗯,这是为了安全"。要保留那些AAA评级。

https://docs.djangoproject.com/en/dev/ref/csrf/#contrib-and-reusable-apps

答案 7 :(得分:0)

@WoooHaaaa一些第三方程序包使用'django.middleware.csrf.CsrfViewMiddleware'中间件。例如,我使用django-rest-oauth,即使禁用了这些东西,我也遇到了像您这样的问题。也许这些软件包像我的案例一样响应了您的请求,因为您使用了身份验证装饰器之类的东西。