csrf_ref

作者: xncode | 来源:发表于2020-11-14 17:37 被阅读0次

csrf默认时启用状态的,在MIDDLEWARE中包含CsrfMiddleware。在未启用的情况下可使用csrf_protect来保护特定的视图。

post form

在form元素中标记内包含:{% csrf_token %}

ajax

在每次ajax请求中加入X_CSRF头部信息(csrftoken)
需要:未设置csrf use sessions,会生成csrftoken这个cookie,其中存放

工作原理

CsrfViewMiddleware生成cookie,每个调用了django.middleware.csrf.get_token函数的response都会附带,在用户每次登录时会通过随机值+secret key的形式构造

返回的html表单中会有名称为csrfmiddlewaretoken的隐藏字段。

此外 ,对于HTTPS还会校验referer 可设置CSRF_TRUSTED_ORIGINS允许名单内的域名可以过校验

cache

如果使用的是cache middleware则会自动加一个vary on cookie的头部,这样可以很好的配合。

但是如果使用cache装饰器在某些视图上,这样需要加一个:

from django.views.decorators.cache import cache_page
from django.views.decorators.csrf import csrf_protect

@cache_page(60 * 15)
@csrf_protect
def my_view(request):
    ...

test

在单元测试的时候,如果加上了enforce_csrf_checks=True则会校验,否则跳过

from django.test import Client
csrf_client = Client(enforce_csrf_checks=True)

局限

不能有效防止子域名上会产生的问题

utilities

csrf_exempt 函数装饰器,解除csrf防护
requires_csrf_token 有的时候404和500了 使用这个装饰器确保设置了csrftoken在form中
ensure_csrf_cookie 确保一个view发送csrf cookie 适用于不包含form使用Ajax操作的情况

设置

CSRF_COOKIE_AGE 默认31449600(一年)
CSRF_COOKIE_DOMAIN None
CSRF_COOKIE_HTTPONLY False 是否设置该cookie是httponly(so不可使用这个)
CSRF_COOKIE_NAME 该cookie的名字,默认csrftoken
CSRF_COOKIE_PATH '/'
CSRF_COOKIE_SECURE False 设为True则只在https环境下发送
CSRF_USE_SESSIONS 没必要
CSRF_FAILURE_VIEW 'django.views.csrf.csrf_failure' 校验失败后调用的视图
CSRF_HEADER_NAME HTTP_X_CSRFTOKEN
CSRF_TRUSTED_ORIGINS

相关文章

  • csrf_ref

    csrf默认时启用状态的,在MIDDLEWARE中包含CsrfMiddleware。在未启用的情况下可使用csrf...

网友评论

      本文标题:csrf_ref

      本文链接:https://www.haomeiwen.com/subject/iodenttx.html