代码之家  ›  专栏  ›  技术社区  ›  MikeN

Django CSRF框架无法禁用,正在破坏我的网站

  •  55
  • MikeN  · 技术社区  · 15 年前

    不能禁用Django CSRF中间件。我已经从我的项目中间件中把它注释掉了,但是由于缺少CSRF问题,我的登录失败了。我在Django的后备箱工作。如果在中间件中没有启用CSRF,那么它如何引起问题?

    我必须禁用它,因为我的网站上有很多发帖请求,CSRF只是破坏。有关于如何在Django中继项目中完全禁用CSRF的反馈吗?

    来自Django主干的“新”CSRF框架也正在破坏一个外部站点,该站点正在我给它们的一个URL上发布(这是一个RESTful API的一部分)。我不能像前面所说的那样禁用CSRF框架,我如何修复它?

    6 回复  |  直到 7 年前
        1
  •  11
  •   Aaron    13 年前

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

    我感觉到你的痛苦。框架改变这种基本功能是不可接受的。即使我想从现在开始使用它,我也会在同一台机器上共享一个django的副本。像这样的更改需要主要的版本号修改。1、x & gt;2。

    不管怎样,为了修复它,我只是把它注释掉了,并停止了经常更新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.")
    
        2
  •  125
  •   Kane Blueriver    9 年前

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

    要手动排除任何CSRF中间件处理的视图功能,可以使用Django.views.decorators.csrf模块中的csrf_-exempt decorator。例如: see doc )

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

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

        3
  •  82
  •   shreddd    14 年前

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

    在settings.py中,向中间件类添加一行:

    MIDDLEWARE_CLASSES = (
    
        myapp.disable.DisableCSRF, 
    
    )
    

    在myapp中创建disable.py,方法如下

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

    基本上,如果你在你的请求中设置了“不强制”的“CSRF”检查,你应该没事。

        4
  •  6
  •   Hank Gay    15 年前

    一般来说,您不应该禁用CSRF保护,因为这样做会打开安全漏洞。如果你坚持的话,尽管

    最近,一种新的做CSRF保护的方法登陆了后备箱。您的站点是否仍被配置为按旧方式运行?这是 the docs for The New Way™ 这里是 docs for The Old Way™ .

        5
  •  4
  •   Yateen    14 年前

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

          'django.middleware.csrf.CsrfViewMiddleware',
          'django.middleware.csrf.CsrfResponseMiddleware',
    
        6
  •  0
  •   blackholll    7 年前

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

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