【问题标题】:CSRF validation does not work on Django using HTTPSCSRF 验证在使用 HTTPS 的 Django 上不起作用
【发布时间】:2016-12-14 22:21:04
【问题描述】:

我正在开发一个应用程序,它的前端是一个 AngularJS API,它向在 Django Rest Framework 中开发的后端 API 发出请求。

The frontend is on the domain: https://front.bluemix.net
And my backend is on the domain: https://back.bluemix.net

我在从前端 API 向后端 API 发出请求时遇到问题。错误是这样的:

Error: CSRF Failed: Referer checking failed - https://front.bluemix.net does not match any trusted origins.

我正在使用 CORS,并且我已经在 Django 后端 API 的 settings.py 中包含以下行:

ALLOWED_HOSTS = []

CORS_ALLOW_CREDENTIALS = True

CORS_ORIGIN_ALLOW_ALL = True

CORS_ALLOW_CREDENTIALS = True


CSRF_TRUSTED_ORIGINS = ['https://front.bluemix.net/']

CORS_REPLACE_HTTPS_REFERER = True

CSRF_COOKIE_DOMAIN = 'bluemix.net'

CORS_ORIGIN_WHITELIST = (
    'https://front.bluemix.net/',
    'front.bluemix.net',
    'bluemix.net',
)

有人知道如何解决这个问题吗?

【问题讨论】:

标签: django django-rest-framework ibm-cloud django-csrf


【解决方案1】:

您的CSRF_TRUSTED_ORIGINS 设置错误 - 将其更改为:

CSRF_TRUSTED_ORIGINS = ['https://front.bluemix.net']

该设置需要hostname only,而不是方案。无论如何,方案都是多余的,因为该设置仅在通过 HTTPS 连接时才有效。

您可能还需要在ALLOWED_HOSTS...中添加一些内容...

编辑:从 Django 4.0 开始,现在需要方案。

【讨论】:

  • 谢谢,问题出在 CSRF_TRUSTED_ORIGINS 上。现在它就像一个魅力:)
  • 谢谢我的朋友。我遇到了同样的问题,现在解决了!!
  • 公共工具:你可能想指定网络服务器端口,所以使用CSRF_TRUSTED_ORIGINS = ['localhost:8080']
  • 谢谢!!!!这些 CORS 问题让我发疯了
  • 请注意,在 Django 4.0 中它发生了变化。现在需要方案。 docs.djangoproject.com/en/4.0/releases/4.0/…
【解决方案2】:

对于遵循此规则的任何人,如果您已将 CORS_ORIGIN_ALLOW_ALL 设置为 True,则无需再设置 CORS_ORIGIN_WHITELIST 变量,因为您已经允许每个主机。

解决我的问题 - 它可能对某人有所帮助

我们遇到的问题是一个特殊的问题,我们有一个客户端应用程序使用 TokenAuthentication 向另一个应用程序发送请求,一个使用 Django Admin 构建的 CRM 并因此使用 SessionAuthentication。当我们打开 Django Admin 应用程序时,SessionMiddleware 正在为该域自动创建一个 session_id cookie。打开客户端应用程序并尝试执行请求时,我们收到以下错误:

Error: CSRF Failed: Referer checking failed - https://domainofthedjangoadminapp.com does not match any trusted origins.

这只是因为 session_id cookie 已在浏览器中设置,因此请求是使用 SessionAuthentication 而不是 TokenAuthentication 发出的,并且失败。

删除 cookie 显然可以解决问题。

【讨论】:

    【解决方案3】:

    如果您运行的是 Django 4.x,则需要更改语法以将模式包含为值的一部分。

    CSRF_TRUSTED_ORIGINS = ['front.bluemix.net']CSRF_TRUSTED_ORIGINS = ['https://front.bluemix.net']

    https://docs.djangoproject.com/en/dev/releases/4.0/#format-change

    【讨论】:

      【解决方案4】:

      根据本文档。 https://docs.djangoproject.com/en/4.0/releases/4.0/#csrf-trusted-origins-changes

      1. 通过以下方式安装 cors-header:doing pip install django-cors-headers

      2. 为您安装的应用添加 corsheaders

        INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'MyApp',
        'crispy_forms',
        'corsheaders',
        ]
        
      3. 将 corsheader 中间件添加到您的中间件

        MIDDLEWARE = [
        '**corsheaders.middleware.CorsMiddleware**',
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
         ]
        

      4 设置原点

       CSRF_TRUSTED_ORIGINS = ['https://front.bluemix.net']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-04
        • 1970-01-01
        • 1970-01-01
        • 2020-03-05
        • 2016-03-03
        • 2011-09-28
        • 2023-03-22
        • 2015-03-18
        相关资源
        最近更新 更多