DRF默认配置会要求较严x-CSRFTOKEN的原因分析
已于 2025年05月20日 13:05 修改
访问次数:0
Django REST framework(DRF)默认对 CSRF 保护机制的处理相对严格,尤其是在使用基于 SessionAuthentication 的认证方式时,会强制校验 X-CSRFToken 请求头。下面是 DRF 默认要求较严 X-CSRFToken 的原因分析:
🔐 一、CSRF 机制的作用
**CSRF(跨站请求伪造)**是一种攻击方式,攻击者诱导用户在已认证网站中执行未授权操作。例如:
- 用户登录了网站 A
- 攻击者诱导用户访问恶意网站 B,后台提交请求到 A
- 因为用户已登录,A 的后端会认为这是合法请求
所以,Django 的 CSRF 机制要求:
- 所有 非安全请求(POST、PUT、DELETE 等)都必须带上有效的 CSRF token
- 客户端需将 token 以 X-CSRFToken 头部发送回来
🚧 二、DRF 默认行为:SessionAuthentication + CSRF
| 认证方式 | 是否检查 CSRF Token | 说明 |
|---|---|---|
SessionAuthentication(默认) | ✅ 检查 X-CSRFToken | 为了防止会话劫持 |
TokenAuthentication / JWTAuthentication | ❌ 不检查 CSRF | 不依赖浏览器 Cookie,不易受 CSRF 攻击 |
📌 原因
DRF 默认使用 SessionAuthentication 是为了兼容 Django 的认证体系(比如 admin 界面、session 登录等),但这也意味着:
- 请求会使用浏览器中的 Cookie 自动携带 sessionid
- 若不校验 CSRF,就容易被跨站调用滥用
因此 DRF 要求你在客户端请求时设置:
X-CSRFToken: <csrftoken>
并且这个 token 必须和用户登录时 Django 设置的 CSRF cookie 一致。
🔄 三、开发中常见问题
✅ 情况一:使用 DRF 浏览器接口(Browsable API)
浏览器会自动携带 session cookie,但你必须:
- 已登录(设置了 sessionid)
- 在请求头中带上 X-CSRFToken(DRF 会自动处理)
否则报错:
403 Forbidden
CSRF Failed: CSRF token missing or incorrect.
⚠️ 情况二:前端 axios/fetch 请求 POST 接口
你需要:
- 从 cookie 中提取 csrftoken
- 设置请求头:
headers: {
'X-CSRFToken': csrftoken
}
🛠 四、绕过或放宽策略的方法(仅开发调试用)
方法一:使用 TokenAuthentication 替代 SessionAuthentication
修改 settings.py:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
),
}
这样不再依赖 session,也不会触发 CSRF 校验。
方法二:手动禁用 CSRF 校验(不推荐,除非你非常确定)
你可以在视图函数中添加:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
@api_view(['POST'])
def your_view(request):
...
或者对基于类的视图使用:
from django.utils.decorators import method_decorator
@method_decorator(csrf_exempt, name='dispatch')
class YourView(APIView):
...
✅ 推荐实践(生产)
| 场景 | 认证方式 | 是否需要 CSRF |
|---|---|---|
| 内网后端服务间调用 | Token / JWT | ❌ 不需要 |
| Web 页面 + Session 登录 | SessionAuthentication | ✅ 必须校验 CSRF |
| 单页应用(SPA) | JWT(Header 认证) | ❌ 不需要 |
| 表单提交(用户登录后) | SessionAuthentication | ✅ 需要 |
✅ 总结
- DRF 默认使用 SessionAuthentication,会强制校验 CSRF Token,是为了保障 基于 session 的 Web 应用安全。
- 如果你开发的是 API-only 服务,推荐使用 TokenAuthentication 或 JWTAuthentication,避免与 CSRF 校验耦合。
- 对于浏览器端 Web 应用,一定要设置 X-CSRFToken 请求头,否则会触发 403。
如你有特定的请求代码或场景需要诊断,我也可以帮你具体定位 CSRF 校验失败的原因。
评论(0)