58

django csrf 中间件不能被禁用。我已从项目的中间件中将其注释掉,但由于缺少 CSRF 问题,我的登录失败。我在 Django 后备箱工作。如果没有在中间件中启用 CSRF,它会如何导致问题?

我必须禁用它,因为我的网站上有很多 CSRF 刚刚中断的 POST 请求。关于如何在 django 主干项目中完全禁用 CSRF 的任何反馈?

来自 Django 主干的“新”CSRF 框架还破坏了一个外部站点,该站点正在进入并在我提供给他们的 URL 上执行 POST(这是 restful API 的一部分。)我无法禁用 CSRF 框架作为我之前说过,我该如何解决这个问题?

4

6 回答 6

127

是的,可以禁用 Django csrf 框架。

要手动排除任何 CSRF 中间件处理的视图函数,可以使用 django.views.decorators.csrf 模块中的 csrf_exempt 装饰器。例如:(见文档

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

..然后{% csrf_token %}从您的模板中删除表单内部,或者如果您没有将其包含在表单中,则保持其他内容不变。

于 2010-07-08T07:48:48.920 回答
82

您可以在中间件中禁用它。

在您的 settings.py 中,向 MIDDLEWARE_CLASSES 添加一行:

MIDDLEWARE_CLASSES = (

    myapp.disable.DisableCSRF, 

)

使用以下内容在 myapp 中创建一个 disable.py

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

基本上,如果您在请求中设置 _dont_enforce_csrf_checks,您应该没问题。

于 2011-01-08T00:44:10.810 回答
11

请参阅下面的答案以获得更好的解决方案。自从我写了这篇文章以来,发生了很多变化。现在有更好的方法来禁用 CSRF。

我感觉到你的痛苦。框架改变这样的基本功能是不可接受的。即使我想从现在开始使用它,我在同一台机器上的旧站点共享 django 的副本。像这样的更改应该需要主要版本号修订。1.x --> 2.x。

无论如何,要修复它,我只是将其注释掉并且不再经常更新 Django。

文件:django/middleware/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.")
于 2010-03-12T10:43:10.787 回答
5

一般来说,您不应该禁用 CSRF 保护,因为这样做会打开安全漏洞。不过,如果你坚持……</p>

一种新的 CSRF 保护方法最近才登陆主干。您的网站是否仍然配置为使用旧方式?这是The New Way™的文档,这里是The Old Way™的文档。

于 2009-10-30T16:45:51.873 回答
4

我只是尝试从我的 settings.py 中删除对 csrf 中间件类的引用,它起作用了。不确定这是否可以接受。任何意见?以下两行被删除 -

      'django.middleware.csrf.CsrfViewMiddleware',
      'django.middleware.csrf.CsrfResponseMiddleware',
于 2010-11-13T11:23:32.870 回答
1

我的 django 版本是 1.11。中间件应该是这样的:

from django.utils.deprecation import MiddlewareMixin


class DisableCSRF(MiddlewareMixin):
    def process_request(self, request):
        setattr(request, '_dont_enforce_csrf_checks', True)
于 2017-10-24T10:19:49.067 回答