【发布时间】:2012-06-07 08:58:26
【问题描述】:
是否可以将 django csrf cookie 设置为仅限 http?类似于 SESSION_COOKIE_HTTPONLY 的会话 cookie,但对于 csrf 呢?
【问题讨论】:
是否可以将 django csrf cookie 设置为仅限 http?类似于 SESSION_COOKIE_HTTPONLY 的会话 cookie,但对于 csrf 呢?
【问题讨论】:
对于 Django1.6+,检查接受的答案。对于 Django1.5 和 prev,没有设置选项。
您可以覆盖django.middleware.csrf.CsrfViewMiddleware 的process_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
【讨论】:
global_settings.CSRF_COOKIE_NAME,除非您想管理该设置。
CSRF_COOKIE_HTTPONLY?
CSRF_COOKIE_NAME 指的是一种使用中间件类更新特定 cookie 的方法。您可以使用 global_settings 中的一个,或者在您的设置中创建一个指向 global_settings 版本的条目,而不是在您的设置中手动指定一个。 1.6+的答案不需要上面的hack,可以在设置中使用CSRF_COOKIE_HTTPONLY = True。绕过任何变通方法。
新设置CSRF_COOKIE_HTTPONLY 在 Django 1.6+ 中可用。
【讨论】:
如果您的版本低于 1.6,您实际上可以自己修补 Django 文件以模仿更高版本中的功能。
补丁很简单,修改的文件在这里可见:
https://github.com/django/django/commit/720888a14699a80a6cd07d32514b9dcd5b1005fb
Pictures showing the edits are provided in case github goes away.
您不必担心这些会被升级覆盖,因为升级本身会包含这些行。
【讨论】: