Django的CSRF框架不能被禁用,正在打破我的网站

django csrf中间件不能被禁用。 我从我的项目的中间件中评论过,但是由于丢失了CSRF问题,我的login失败了。 我正在从Django主干工作。 如果在中间件中没有启用,CSRF如何引发问题?

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

Django主干的“新”CSRF框架也打破了一个外部网站,正在对我给它的URL(这是一个restful API的一部分)进行POST。我不能将CSRF框架禁用为我刚才说过,我该如何解决这个问题?

查看下面的答案以获得更好的解决scheme。 自从我写这篇文章以来,很多变了。 现在有更好的方法来禁用CSRF。

我感到你的痛苦。 改变这种基本function的框架是不可接受的。 即使我想从现在开始使用它,我在同一台机器上共享遗留的站点共享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.") 

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

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

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

然后从模板中删除表单中的{% csrf_token %} ,或者如果未将其包含在表单中,则保留其他内容。

您可以在中间件中禁用此function。

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

 MIDDLEWARE_CLASSES = ( myapp.disable.DisableCSRF, ) 

使用以下命令在myapp中创build一个disable.py

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

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

一般来说,你不应该禁用CSRF保护,因为这样做会造成安全漏洞。 如果你坚持,虽然…

最近,一种新的CSRF保护方式降落在主干上。 你的网站偶然仍然configuration为旧的方式吗? 以下是The New Way™的文档 ,这里是The Old Way™的文档 。

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

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

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

 from django.utils.deprecation import MiddlewareMixin class DisableCSRF(MiddlewareMixin): def process_request(self, request): setattr(request, '_dont_enforce_csrf_checks', True)