问题描述
我正在开发两个独立的 django(3.1 版)项目。我不断收到“403:CSRF cookie 未设置”错误,不知道是什么问题。
- 项目 1 在 Apache 服务器上运行并接收包含 JSON 数据的 POST 请求并发回 JSON 响应。
- 在本地主机上运行的项目 2 通过 Javascript
XMLHttpRequest()
函数将 POST 发送到项目 1。
This question seems to be having the same problem as me,但我试图在不同的 URL 之间发送信息(更具体地说,从 localhost:8000 POST,最终是 url.com,到 engine.url.com),我不认为该用户的解决方案对我有用。
我已尝试在项目 1 @csrf_exempt
上使用 views.py
装饰器,效果很好。但是,个人身份信息可能会在两者之间发送,所以我想确保事情是安全的。如果我没记错的话,csrf cookie 是最佳实践,所以我在视图之前有装饰器 @ensure_csrf_cookie
。
我已经尝试了所有可以在网上找到的方法来解决问题。在项目 1 settings.py
中,我在 'corsheaders'
中包含了 INSTALLED_APPS
,在 'django.middleware.csrf.CsrfViewMiddleware'
中包含了 MIDDLEWARE
,并在文件末尾包含以下代码:
CSRF_COOKIE_SECURE = False
SESSION_COOKIE_SECURE = False
CSRF_COOKIE_HTTPONLY = False
CORS_ALLOWED_ORIGINS = [
'http://project.com','https://project.com','http://engine.project.com','https://engine.project.com','localhost:8000','http://localhost:8000','127.0.0.1','http://127.0.0.1',]
CORS_ALLOW_HEADERS = [
'X-CSRFToken','x-csrftoken','X-CSRFTOKEN','content-type',]
我在 Project 2 模板中包含了一个 {% csrf_token %}
,但实际的 POST 请求来自 Javascript。以下 Javascript 静态文件的相关摘录:
function getCookie(name) {
let cookieValue = null;
if (document.cookie && document.cookie !== '') {
const cookies = document.cookie.split(';');
for (let i = 0; i < cookies.length; i++) {
const cookie = cookies[i].trim();
// Does this cookie string begin with the name we want?
if (cookie.substring(0,name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
function getPaymentDates(jsonData) {
const csrftoken = getCookie('csrftoken');
jsonData.csrfmiddlewaretoken = csrftoken;
var sentJsonString = JSON.stringify(jsonData);
var xhr = new XMLHttpRequest();
xhr.open("POST","http://engine.project.com/app/",false);
xhr.setRequestHeader('X-CSRFToken',csrftoken);
xhr.setRequestHeader('Content-Type','application/json');
xhr.send(sentJsonString);
// xhr response should be a json string
return xhr.response;
}
getCookie()
直接从 csrf django documentation 上抬起。
在控制台中测试后,我知道获得了一个 cookie,但在应用程序可以对数据执行任何操作之前我收到了 403 错误。同样,如果我使用 @csrf_exempt
,那么应用程序运行良好,但如果这会使数据容易受到恶意攻击,那么我想防止这种情况发生。
我是否多余地调用了导致错误的 csrf cookie?我被难住了,而且对 Web 开发有点陌生。如果有助于回答这个问题,很高兴提供更多代码。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)