未设置CSRF cookie:从Javascript发布到单独的Django项目

未设置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),我认

我正在开发两个独立的django(3.1版)项目。我一直收到一个“403:CSRF cookie not set”错误,不知道问题出在哪里

  • Project 1在Apache服务器上运行,接收包含JSON数据的POST请求并发送回JSON响应
  • 在本地主机上运行的项目2通过Javascript
    XMLHttpRequest()
    函数将POST发送到项目1
,但我正在尝试在不同的URL之间发送信息(更具体地说,从localhost:8000,最终是URL.com,到engine.URL.com),我认为用户的解决方案对我不起作用

我试过在Project1
views.py
上使用
@csrf\u export
装饰器,效果很好。但是,个人身份信息可能会在两者之间发送,因此我希望确保事情的安全。如果我没有弄错的话,csrf cookie是最佳实践,因此我在查看之前有decorator
@sure\u csrf\u cookie

我已经尝试了所有我能在网上找到的方法来解决这个问题。在项目1
settings.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过期问题,并使用了您的链接来解决它。:)@巴尼,不客气很高兴知道它很有用