CSRF cookie 未设置:从 Javascript POST 以分离 Django 项目

问题描述

我正在开发两个独立的 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 (将#修改为@)