CSRF验证在使用HTTPS的Django上不起作用

qgelzfjb  于 2023-02-10  发布在  Go
关注(0)|答案(6)|浏览(169)

我正在开发一个应用程序,前端是一个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的www.example.com中包含了以下代码行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',
)

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

z2acfund

z2acfund1#

Django 4.0及以上版本

对于Django 4.0及以上版本,CSRF_TRUSTED_ORIGINS必须包含方案和主机,例如:

CSRF_TRUSTED_ORIGINS = ['https://front.bluemix.net']
Django 3.2及更低版本

对于Django 3.2及更低版本,CSRF_TRUSTED_ORIGINS必须只包含主机名,而不包含方案:

CSRF_TRUSTED_ORIGINS = ['front.bluemix.net']

您可能还需要在ALLOWED_HOSTS中放入一些内容...

aor9mmx1

aor9mmx12#

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

tkclm6bt

tkclm6bt3#

对于任何遵循此规则的人来说,如果您已经将CORS_ORIGIN_ALLOW_ALL设置为True,那么您就不需要再设置CORS_ORIGIN_WHITELIST变量,因为您已经允许了每台主机。

我的问题解决方案-它可能会帮助别人

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

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

这仅仅是因为session_idcookie已经在浏览器中设置,因此,请求是使用SessionAuthentication而不是TokenAuthentication发出的,并且失败。
删除cookie显然是在解决问题。

7lrncoxx

7lrncoxx4#

根据此文档。https://docs.djangoproject.com/en/4.0/releases/4.0/#csrf-trusted-origins-changes
1.通过以下方式安装cors-header:做pip install django-cors-headers
1.将corsheader添加到已安装的应用

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'MyApp',
'crispy_forms',
'corsheaders',
]

1.将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']
kyxcudwk

kyxcudwk5#

2022年4月更新:

如果您的django版本是**"4.x.x"**:

python -m django --version

// 4.x.x

然后,如果错误如下所示:
来源检查失败-https://example.com与任何可信来源都不匹配。
将以下代码添加到**"www.example.com":settings.py":

CSRF_TRUSTED_ORIGINS = ['https://example.com']

在您的情况下,您得到了与上面类似的错误:
错误:CSRF失败:引用检查失败-https://front.bluemix.net与任何可信来源都不匹配。
因此,您需要将此代码添加到您的"www.example.com":settings.py"**:

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

ohtdti5x6#

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

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

改成

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

相关问题