CSRF验证不适用于使用HTTPS的Django

ccr*_*ccr 8 django django-csrf cors django-rest-framework ibm-cloud

我正在开发一个应用程序,前端是一个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
Run Code Online (Sandbox Code Playgroud)

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

Error: CSRF Failed: Referer checking failed - https://front.bluemix.net does not match any trusted origins.
Run Code Online (Sandbox Code Playgroud)

我正在使用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',
)
Run Code Online (Sandbox Code Playgroud)

谁知道如何解决这个问题?

sol*_*oke 26

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

CSRF_TRUSTED_ORIGINS = ['front.bluemix.net']
Run Code Online (Sandbox Code Playgroud)

该设置需要主机名,而不是方案.无论如何,方案是多余的,因为该设置仅在通过HTTPS连接时有任何影响.

你可能还需要把东西放进ALLOWED_HOSTS......

  • 请注意,在 Django 4.0 中它发生了变化。现在需要方案。https://docs.djangoproject.com/en/4.0/releases/4.0/#csrf-trusted-origins-changes-4-0 (7认同)
  • 公共实用程序:您可能想要指定 Web 服务器端口,因此使用 `CSRF_TRUSTED_ORIGINS = ['localhost:8080']` (2认同)

小智 16

如果您运行的是 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


小智 13

我也面临这个问题。确保域名不包含尾部斜杠。代替

CSRF_TRUSTED_ORIGINS = ['https://front.bluemix.net/']
Run Code Online (Sandbox Code Playgroud)

将其更改为

CSRF_TRUSTED_ORIGINS = ['https://front.bluemix.net']
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢。这种愚蠢的行为耗费了我们很多时间。 (3认同)

Tys*_*dez 5

对于遵循此规则的任何人,如果您将设置CORS_ORIGIN_ALLOW_ALLTrue,则您不再需要设置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.
Run Code Online (Sandbox Code Playgroud)

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

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


小智 5

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

  1. 通过以下方式安装 cors-header: 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',
    ]
    
    Run Code Online (Sandbox Code Playgroud)
  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',
     ]
    
    Run Code Online (Sandbox Code Playgroud)

4 设置原点

 CSRF_TRUSTED_ORIGINS = ['https://front.bluemix.net']
Run Code Online (Sandbox Code Playgroud)


小智 5

2022 年 4 月更新:

如果您的django 版本“4.xx”

python -m django --version

// 4.x.x
Run Code Online (Sandbox Code Playgroud)

那么如果报错如下图:

来源检查失败 - https://example.com 与任何可信来源不匹配。

将以下代码添加到“settings.py”

python -m django --version

// 4.x.x
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您遇到了与上面类似的错误:

错误:CSRF 失败:引用检查失败 - https://front.bluemix.net与任何可信来源不匹配。

因此,您需要将此代码添加到您的“settings.py”中:

CSRF_TRUSTED_ORIGINS = ['https://example.com']
Run Code Online (Sandbox Code Playgroud)