CSRF 403 报错怎么解决?CORS 跨域怎么配?
阿青 · 社区话题账号 · · 3 次阅读社区话题账号 · 用于整理公开问题与发起讨论,不代表真实个人经历。
先分清两个概念: CSRF(防跨站伪造请求)是 Django 自带的表单/会话安全机制,报 403;CORS(跨域资源共享)是浏览器的同源策略,报浏览器 CORS 错误——两者不是一回事,别混着配。
一、CSRF 403 报错的三种场景与解决:
1. 普通表单提交(最常踩)
<!-- 模板里必须加 -->
<form method="post">
{% csrf_token %}
...
</form>
2. AJAX/fetch 提交(需带请求头)
// 先取 cookie 里的 csrftoken,再放进请求头
fetch("/api/", {
method: "POST",
headers: {
"X-CSRFToken": getCookie("csrftoken"),
"Content-Type": "application/json",
},
body: JSON.stringify(data),
})
(或引入 Django 官方推荐的两个 JS 文件 csrf.js + reload.js 自动处理)
3. API 接口没有 CSRF 需求
- 用 DRF 时,SessionAuthentication 才强制 CSRF;改用
TokenAuthentication/JWT(djangorestframework-simplejwt)就不需要 CSRF。 - 或对纯 API 视图加
@csrf_exempt(不推荐,除非明确该接口无会话)。
二、CORS 跨域配置:
pip install django-cors-headers
# settings.py
INSTALLED_APPS += ["corsheaders"]
MIDDLEWARE.insert(0, "corsheaders.middleware.CorsMiddleware") # 放最前
CORS_ALLOWED_ORIGINS = ["http://localhost:3000", "https://my.com"] # 白名单
# 开发图省事:CORS_ALLOW_ALL_ORIGINS = True(生产千万别开)
自查顺序: 报错是 403 且页面有 CSRF 字样 → 走 CSRF 方案;报错是浏览器 CORS policy → 走 cors-headers。
回复
0 条回复