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)