2026-01-21 09:55:42
Django的CSRF保护机制通过csrftoken和csrfmiddlewaretoken两个不同Token的协同工作,结合浏览器同源策略,有效防止跨站请求伪造攻击。其核心原理和流程如下:
一、两个Token的分工与特性csrftoken(Cookie存储)
由服务器在用户首次访问时通过Set-Cookie响应头设置,存储在浏览器Cookie中。
持久性:同一会话内保持不变(除非用户登录/注销),确保后续请求自动携带该Token。
作用:作为基础验证标识,用于跨请求的关联性检查。
csrfmiddlewaretoken(动态表单Token)
嵌入服务器生成的HTML表单中(如<input type="hidden">),每次GET请求页面时动态生成新值。
动态性:每次生成唯一值,与当前请求强关联。
作用:防止攻击者预测或复用Token,确保表单提交的合法性。
Token分发阶段
用户首次访问时,服务器设置csrftoken到Cookie,并在HTML中嵌入csrfmiddlewaretoken。
后续GET请求中,浏览器自动携带csrftoken(Cookie),服务器动态生成新的csrfmiddlewaretoken并插入表单。
请求验证阶段
POST请求提交时:
浏览器自动将csrftoken添加到请求头(如X-CSRFToken),同时将表单中的csrfmiddlewaretoken包含在请求体。
服务器验证逻辑:
检查请求头中的csrftoken与请求体中的csrfmiddlewaretoken是否字面量完全一致。
匹配则通过验证,否则拒绝请求(返回403错误)。
双重验证的不可预测性攻击者需同时伪造两个Token才能成功:
csrftoken虽可通过Cookie获取,但受浏览器同源策略限制,跨域脚本无法直接读取其他域的Cookie。
csrfmiddlewaretoken动态生成且每次不同,攻击者无法预测其值。
浏览器同源策略的补充即使攻击者通过XSS漏洞获取csrftoken,仍需获取当前页面的csrfmiddlewaretoken,而后者因动态生成且嵌入表单,难以被跨站脚本获取。
会话一致性保障csrftoken的持久性确保同一会话内所有请求关联同一基础Token,而csrfmiddlewaretoken的动态性防止重放攻击,两者结合形成多层次防护。
恶意链接无法获取用户当前会话的csrfmiddlewaretoken(因动态生成且嵌入合法表单)。
即使攻击者通过其他手段获取csrftoken,提交的请求中csrfmiddlewaretoken不匹配,服务器拒绝请求。
浏览器同源策略阻止跨域脚本读取Cookie或表单数据,进一步阻断攻击路径。
单一Token机制的不足:若仅使用Cookie中的csrftoken,攻击者可能通过XSS漏洞窃取Cookie并伪造请求。Django的双重Token机制通过动态表单Token弥补了这一漏洞。
与同步令牌模式的区别:传统同步令牌(如每次请求生成新Token)可能增加服务器负担,而Django的csrftoken持久性+csrfmiddlewaretoken动态性平衡了安全性与性能。
Django的CSRF保护机制通过持久性Cookie Token与动态表单Token的协同验证,结合浏览器同源策略,构建了多层次的防御体系。这种设计既利用了Cookie的自动携带特性,又通过动态Token防止重放攻击,有效弥补了单一防护手段的不足,为Web应用提供了可靠的安全保障。