未设置CSRF cookie:从Javascript发布到单独的Django项目
我正在开发两个独立的django(3.1版)项目。我一直收到一个“403:CSRF cookie not set”错误,不知道问题出在哪里未设置CSRF cookie:从Javascript发布到单独的Django项目,django,cookies,cross-domain,csrf,django-csrf,Django,Cookies,Cross Domain,Csrf,Django Csrf,我正在开发两个独立的django(3.1版)项目。我一直收到一个“403:CSRF cookie not set”错误,不知道问题出在哪里 Project 1在Apache服务器上运行,接收包含JSON数据的POST请求并发送回JSON响应 在本地主机上运行的项目2通过JavascriptXMLHttpRequest()函数将POST发送到项目1 ,但我正在尝试在不同的URL之间发送信息(更具体地说,从localhost:8000,最终是URL.com,到engine.URL.com),我认
- Project 1在Apache服务器上运行,接收包含JSON数据的POST请求并发送回JSON响应
- 在本地主机上运行的项目2通过Javascript
函数将POST发送到项目1XMLHttpRequest()
views.py
上使用@csrf\u export
装饰器,效果很好。但是,个人身份信息可能会在两者之间发送,因此我希望确保事情的安全。如果我没有弄错的话,csrf cookie是最佳实践,因此我在查看之前有decorator@sure\u csrf\u cookie
我已经尝试了所有我能在网上找到的方法来解决这个问题。在项目1settings.py
中,我已将'corsheaders'
包含在我的安装的应用程序中,'django.middleware.csrf.CsrfViewMiddleware'
包含在中间件中,并在文件末尾包含以下代码:
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',
]
我在Project2模板中包含了一个{%csrf\u 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(名称){
让cookieValue=null;
if(document.cookie&&document.cookie!=''){
常量cookies=document.cookie.split(“;”);
for(设i=0;i
getCookie()
在控制台中进行测试后,我知道获得了cookie,但在应用程序能够处理数据之前,我得到了403错误。同样,如果我使用@csrf_-emption
,那么应用程序工作正常,但是如果这使得数据容易受到恶意攻击,那么我想防止这种情况
我是否冗余地调用导致错误的csrf cookie?我被难住了,对web开发有些陌生。如果有助于回答此问题,很乐意提供更多代码。请尝试以下操作:
通过在调用getCookie()之前在模板上添加以下代码,在文档上设置所需的cookie:
document.cookie=“csrftoken={{csrf_token}}”
请尝试以下操作:
通过在调用getCookie()之前在模板上添加以下代码,在文档上设置所需的cookie:
document.cookie=“csrftoken={{csrf_token}}”
@Ruperto是对的。您也可以尝试不将任何cookie设置为一个全局变量
<script>
var csrftoken="{{ csrf_token | escapejs }}"
</script>
更新:
发送csrftoken的一个解决方案是设置csrf中间件。在settings.py
中,我的中间件如下所示:
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
# ...
]
@鲁珀托是对的。您也可以尝试不将任何cookie设置为一个全局变量
<script>
var csrftoken="{{ csrf_token | escapejs }}"
</script>
更新:
发送csrftoken的一个解决方案是设置csrf中间件。在settings.py
中,我的中间件如下所示:
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
# ...
]
不幸的是,这不起作用。我在模板中尝试了这一行,也尝试了添加到静态文件中,但仍然得到403错误。不幸的是,这不起作用。我在模板中尝试了这一行,也尝试了添加到静态文件中,但仍然出现403错误。遗憾的是,Ruperto的解决方案没有起作用。我试过你的,但我仍然得到一个403错误。问题:我是否需要在发送帖子或接收帖子的视图顶部添加@Sure_csrf_cookie?我通常使用csrf中间件。我已经更新了我的答案。我希望这会有帮助。这可能也会有帮助@Ruperto谢谢,有趣的是,我今天自己遇到了一个csrf过期问题,并使用了您的链接来解决它。:)@巴尼,不客气很高兴知道这是有用的鲁珀托的解决方案不幸没有起作用。我试过你的,但我仍然得到一个403错误。问题:我是否需要在发送帖子或接收帖子的视图顶部添加@Sure_csrf_cookie?我通常使用csrf中间件。我已经更新了我的答案。我希望这会有帮助。这可能也会有帮助@Ruperto谢谢,有趣的是,我今天自己遇到了一个csrf过期问题,并使用了您的链接来解决它。:)@巴尼,不客气很高兴知道它很有用