Django的CSRF验证机制具体是怎样的?
Django CSRF 验证机制详解
没错,你对Django CSRF验证逻辑的理解完全在线!我来把这个过程拆解得更清晰:
核心处理中间件
整个CSRF验证流程是由CsrfViewMiddleware这个中间件全权负责的,它会在请求处理的环节自动完成令牌校验。
待比对的两组令牌
验证时会从两个维度获取令牌,然后进行匹配:
- 请求侧提交的令牌:
- 如果是POST表单请求,从
request.POST.get('csrfmiddlewaretoken', '')提取表单里的令牌字段 - 如果是AJAX这类非表单请求,从
request.META.get(settings.CSRF_HEADER_NAME, '')提取请求头里的令牌(默认请求头字段是HTTP_X_CSRFTOKEN)
- 如果是POST表单请求,从
- 服务器端存储的令牌:
- 从用户session中获取:
request.session.get(CSRF_SESSION_KEY) - 从用户Cookie中获取:
request.COOKIES[settings.CSRF_COOKIE_NAME](默认Cookie名为csrftoken)
- 从用户session中获取:
解密比对逻辑
这里有个关键细节:上面两组拿到的令牌本身是不同的字符串,不能直接对比。必须通过Django内部的_unsalt_cipher_token函数对两者分别解密,解密后会得到相同的核心密钥内容(就是你提到的secr...那段)。只有解密后的内容完全一致,CSRF验证才会通过。
内容的提问来源于stack exchange,提问作者Jibin
相关产品推荐
相关产品推荐

