【问题标题】:Django CSRF cookie HttpOnlyDjango CSRF cookie HttpOnly
【发布时间】:2012-06-07 08:58:26
【问题描述】:

是否可以将 django csrf cookie 设置为仅限 http?类似于 SESSION_COOKIE_HTTPONLY 的会话 cookie,但对于 csrf 呢?

【问题讨论】:

    标签: django csrf httponly


    【解决方案1】:

    对于 Django1.6+,检查接受的答案。对于 Django1.5 和 prev,没有设置选项。

    您可以覆盖django.middleware.csrf.CsrfViewMiddlewareprocess_response() 方法并使用自定义的方法代替MIDDLEWARE_CLASSES 中的CsrfViewMiddleware

    class Foo(CsrfViewMiddleware):
        def process_response(self, request, response):
            response = super(Foo, self).process_response(request, response)
            response.cookies[settings.CSRF_COOKIE_NAME]['httponly'] = True
            return response
    

    或者在CsrfViewMiddleware之后调用的另一个中间件作为响应

    class Foo(object):
        def process_response(self, request, response):
            if settings.CSRF_COOKIE_NAME in response.cookies:
                response.cookies[settings.CSRF_COOKIE_NAME]['httponly'] = True
            return response
    

    【讨论】:

    • 我尝试了第二种方法,效果很好,谢谢!刚刚在 csrf 之前添加了中间件(很明显,但我花了一段时间,因为我把它放在后面)并将 CSRF_COOKIE_NAME 放在设置中,仅此而已。
    • 这段代码有错别字。它应该是 response = super(Foo, self).process_response(request, response)
    • @Mark 我知道这是旧的,但更好的选择是使用global_settings.CSRF_COOKIE_NAME,除非您想管理该设置。
    • @MikeMcMahon 可能你的意思是CSRF_COOKIE_HTTPONLY
    • 没有。在上面的答案中,CSRF_COOKIE_NAME 指的是一种使用中间件类更新特定 cookie 的方法。您可以使用 global_settings 中的一个,或者在您的设置中创建一个指向 global_settings 版本的条目,而不是在您的设置中手动指定一个。 1.6+的答案不需要上面的hack,可以在设置中使用CSRF_COOKIE_HTTPONLY = True。绕过任何变通方法。
    【解决方案2】:

    新设置CSRF_COOKIE_HTTPONLY 在 Django 1.6+ 中可用。

    【讨论】:

    • 对于任何拥有 Django 升级实例的人来说,这应该是答案。其他任何东西都是黑客攻击。
    【解决方案3】:

    如果您的版本低于 1.6,您实际上可以自己修补 Django 文件以模仿更高版本中的功能。

    补丁很简单,修改的文件在这里可见:

    https://github.com/django/django/commit/720888a14699a80a6cd07d32514b9dcd5b1005fb

    Pictures showing the edits are provided in case github goes away.

    Here's the rest of that page.

    您不必担心这些会被升级覆盖,因为升级本身会包含这些行。

    【讨论】:

    • 虽然我认为 imgur 消失的几率高于 github 消失的几率,但我已经按照要求完成了。
    猜你喜欢
    • 2019-10-28
    • 2017-06-27
    • 1970-01-01
    • 2017-12-04
    • 2011-04-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多