无cookies的django的csrf保护。

django-session-csrf-per-view的Python项目详细描述


这是什么?

django-session-csrf是django的csrf的另一种实现 不使用cookies的保护。相反,它将csrf令牌保持在 使用django会话后端的服务器。CSRF令牌必须仍然是 包含在所有post请求中(表单中的csrfmiddlewaretoken或 使用x-csrftoken头)。

安装

来自PYPI:

pip install django-session-csrf-per-view

来自github:

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

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

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

django.middleware.csrf.CsrfViewMiddleware替换为 session_csrf.CsrfMiddleware在您的^{tt7}中$ 并确保它列在AuthenticationMiddleware之后:

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

然后我们必须修改@csrf_protectdecorator:

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 缓存中的令牌。它可以通过以下设置进行控制:

^{tt13}$

the name used for the anonymous user’s cookie

Default: ^{tt14}$

^{tt15}$

the cache timeout (in seconds) to use for the anonymous CSRF tokens

Default: ^{tt16}$

请注意,默认情况下,django使用本地内存缓存,这不会 如果有多个Web服务器线程,请使用匿名CSRF。 要使用匿名csrf,必须配置共享的缓存 在web服务器实例之间,例如memcached。见Django cache documentation 更多信息。

如果只希望视图对已登录的用户具有csrf保护,则可以 使用anonymous_csrf_exemptdecorator。如果 例如,匿名视图通过验证码进行保护。

from session_csrf import anonymous_csrf_exempt

@anonymous_csrf_exempt
def protected_in_another_way(request):
    ...

如果希望所有视图对匿名用户具有csrf保护,请使用 以下设置:

^{tt18}$

always provide CSRF protection for anonymous users

Default: False

每个操作csfr令牌

对于使用每个动作的csrf令牌,您需要装饰您的视图:

fromsession_csrf.decoratorsimportper_view_csrf@per_view_csrfdefyour_view(request):pass

或基于类的视图:

fromdjango.views.genericimportTemplateViewfromsession_csrf.mixinsimportPerViewCsrfMixinclassYourView(PerViewCsrfMixin,TemplateView):pass

并在模板中添加模板标记:

{%loadsession_csrf%}<form>{%per_view_csrf"app.views.your_view"%}</form>

我为什么要这个?

  1. 您的站点位于子域上,而其他站点不在 控制,所以饼干可以从任何地方来。
  2. 您担心攻击者使用flash伪造http头。
  3. 你已经厌倦了需要一个引用头。

为什么我不想要这个?

  1. 在会话中存储令牌意味着您必须更多地访问会话存储 经常。
  2. csrf保护匿名用户的表单需要做更多的工作。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Clojure关键字在内存中的大小是多少?   Java中有固定长度的通用数组对象吗?   PostgreSQL:通过Java更新我的用户表   错误:使用java解析xml   java Json显示列表中对象的名称   java比较JodaTime时区   与JAVA中的API和包的区别?   java的int值在for循环中不改变   谷歌应用引擎中的java RSA   迁移到spring 5后出现java非法字符错误   java Websphere管理控制台不工作   JavaGSON如何始终在json中包含毫秒?   带有空格和双引号的windows Java ProcessBuilder命令参数失败   java错误:重复的zip条目[43.jar:org/apache/http/annotation/NotThreadSafe.class]