跳转到主要内容

无cookie的Django CSRF保护。

项目描述

这是什么?

django-session-csrf 是Django CSRF保护的一种替代实现,不使用cookies。相反,它使用Django的session后端在服务器上维护CSRF令牌。CSRF令牌必须仍然包含在所有POST请求中(在表单中使用csrfmiddlewaretoken或通过X-CSRFTOKEN头)。

安装

从PyPI

pip install django-session-csrf

从github

git clone git://github.com/mozilla/django-session-csrf.git

在您的 TEMPLATE_CONTEXT_PROCESSORS 中将 django.core.context_processors.csrf 替换为 session_csrf.context_processor

TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    'session_csrf.context_processor',
    ...
)

在您的 MIDDLEWARE_CLASSES 中将 django.middleware.csrf.CsrfViewMiddleware 替换为 session_csrf.CsrfMiddleware 并确保它在AuthenticationMiddleware之后列出

MIDDLEWARE_CLASSES = (
    ...
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    ...
    'session_csrf.CsrfMiddleware',
    ...
)

然后我们必须对Django进行猴子补丁以修复 @csrf_protect 装饰器

import session_csrf
session_csrf.monkeypatch()

确保它在类似您的根 urls.py 的地方,以便在导入视图之前应用补丁。

Django的差异

django-session-csrf 不会为匿名用户分配 CSRF 令牌,因为我们不希望为每个匿名用户都支持一个会话。相反,需要匿名表单的视图可以使用 @anonymous_csrf 进行装饰。

from session_csrf import anonymous_csrf

@anonymous_csrf
def login(request):
    ...

anonymous_csrf 使用缓存为匿名用户提供轻量级的会话。它发送一个cookie来唯一标识用户,并将 CSRF 令牌存储在缓存中。可以通过以下设置进行控制:

ANON_COOKIE

匿名用户cookie使用的名称

默认值: anoncsrf

ANON_TIMEOUT

用于匿名 CSRF 令牌的缓存超时时间(以秒为单位)

默认值: 60 * 60 * 2 # 2 hours

注意,默认情况下 Django 使用本地内存缓存,这在与多个 Web 服务器线程一起使用时将无法与匿名 CSRF 一起工作。要使用匿名 CSRF,您必须配置一个在 Web 服务器实例之间共享的缓存,例如 Memcached。有关更多信息,请参阅 Django 缓存文档

如果您只想为登录用户提供 CSRF 保护视图,可以使用 anonymous_csrf_exempt 装饰器。如果匿名视图通过 CAPTCHA 进行保护,这可能很有用。

from session_csrf import anonymous_csrf_exempt

@anonymous_csrf_exempt
def protected_in_another_way(request):
    ...

如果您希望所有视图都为匿名用户提供 CSRF 保护,请使用以下设置:

ANON_ALWAYS

始终为匿名用户提供 CSRF 保护

默认值: False

为什么我想要这个?

  1. 您的网站位于一个由其他网站组成的子域名上,这些网站不在您的控制之下,因此 cookie 可能来自任何地方。

  2. 您担心攻击者使用 Flash 伪造 HTTP 头部。

  3. 您厌倦了要求 Referer 头部。

为什么我不想这样做?

  1. 将令牌存储在会话中意味着您需要更频繁地调用会话存储。

  2. 为匿名用户提供 CSRF 保护表单需要更多的工作。

项目详情


下载文件

为您的平台下载文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

django-session-csrf-0.7.1.tar.gz (8.6 kB 查看哈希)

上传时间

构建分布

django_session_csrf-0.7.1-py2.py3-none-any.whl (10.9 kB 查看哈希)

上传时间 Python 2 Python 3

由以下支持