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
网友评论