CSRF 验证不适用于使用 HTTPS 的 Django
CSRF validation does not work on Django using HTTPS
我正在开发一个应用程序,其前端是 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 后端 settings.py 中包含以下行 API:
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',
)
有人知道如何解决这个问题吗?
您的 CSRF_TRUSTED_ORIGINS
设置有误 - 将其更改为:
CSRF_TRUSTED_ORIGINS = ['https://front.bluemix.net']
该设置需要 hostname only,而不是方案。无论如何,方案都是多余的,因为该设置仅在通过 HTTPS 连接时有效。
您可能还需要在 ALLOWED_HOSTS
...
中添加一些内容
编辑:现在需要 Django 4.0 方案。
对于所有关注此内容的人,如果您已将 CORS_ORIGIN_ALLOW_ALL
设置为 True
,则无需再设置 CORS_ORIGIN_WHITELIST
变量,因为您允许每个主机已经.
我的问题的解决方案 - 它可能会对某人有所帮助
我们遇到的问题很特殊,我们有一个客户端应用程序使用 TokenAuthentication 向另一个应用程序发送请求,这是一个使用 Django Admin 构建的 CRM,因此使用 会话验证。当我们打开 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 显然解决了问题。
如果您是 运行 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
根据此文档。 https://docs.djangoproject.com/en/4.0/releases/4.0/#csrf-trusted-origins-changes
通过以下方式安装 cors-header:
pip install django-cors-headers
为您安装的应用程序添加 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',
]
将 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']
2022 年 4 月更新:
如果你的 django 版本 是 "4.x.x":
python -m django --version
// 4.x.x
那么,如果错误如下图:
Origin checking failed - https://example.com does not match any trusted origins.
将下面的代码添加到 "settings.py":
CSRF_TRUSTED_ORIGINS = ['https://example.com']
在你的情况下,你遇到了与上面类似的错误:
Error: CSRF Failed: Referer checking failed - https://front.bluemix.net does not match any trusted origins.
因此,您需要将此代码添加到 您的“settings.py”:
CSRF_TRUSTED_ORIGINS = ['https://front.bluemix.net']
我正在开发一个应用程序,其前端是 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 后端 settings.py 中包含以下行 API:
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',
)
有人知道如何解决这个问题吗?
您的 CSRF_TRUSTED_ORIGINS
设置有误 - 将其更改为:
CSRF_TRUSTED_ORIGINS = ['https://front.bluemix.net']
该设置需要 hostname only,而不是方案。无论如何,方案都是多余的,因为该设置仅在通过 HTTPS 连接时有效。
您可能还需要在 ALLOWED_HOSTS
...
编辑:现在需要 Django 4.0 方案。
对于所有关注此内容的人,如果您已将 CORS_ORIGIN_ALLOW_ALL
设置为 True
,则无需再设置 CORS_ORIGIN_WHITELIST
变量,因为您允许每个主机已经.
我的问题的解决方案 - 它可能会对某人有所帮助
我们遇到的问题很特殊,我们有一个客户端应用程序使用 TokenAuthentication 向另一个应用程序发送请求,这是一个使用 Django Admin 构建的 CRM,因此使用 会话验证。当我们打开 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 显然解决了问题。
如果您是 运行 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
根据此文档。 https://docs.djangoproject.com/en/4.0/releases/4.0/#csrf-trusted-origins-changes
通过以下方式安装 cors-header:
pip install django-cors-headers
为您安装的应用程序添加 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', ]
将 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']
2022 年 4 月更新:
如果你的 django 版本 是 "4.x.x":
python -m django --version
// 4.x.x
那么,如果错误如下图:
Origin checking failed - https://example.com does not match any trusted origins.
将下面的代码添加到 "settings.py":
CSRF_TRUSTED_ORIGINS = ['https://example.com']
在你的情况下,你遇到了与上面类似的错误:
Error: CSRF Failed: Referer checking failed - https://front.bluemix.net does not match any trusted origins.
因此,您需要将此代码添加到 您的“settings.py”:
CSRF_TRUSTED_ORIGINS = ['https://front.bluemix.net']