Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Heroku上的Django CSRF_COOKIE_域_Django_Heroku_Django Csrf - Fatal编程技术网

Heroku上的Django CSRF_COOKIE_域

Heroku上的Django CSRF_COOKIE_域,django,heroku,django-csrf,Django,Heroku,Django Csrf,所以我们在Heroku上部署了Django应用程序,一切都很好。直到我看到饼干。我有csrftokencookies,用于app staging.herokapp.com和.app staging.herokapp.com。但是当我设置CSRF\u COOKIE\u DOMAIN='app staging.herokapp.com'时,我自动得到了错误的东西.app staging.herokapp.com 我尽我所能,但毫无帮助。我尝试了当前的Firefox(83.0)和Chromium。最大

所以我们在Heroku上部署了Django应用程序,一切都很好。直到我看到饼干。我有
csrftoken
cookies,用于
app staging.herokapp.com
.app staging.herokapp.com
。但是当我设置
CSRF\u COOKIE\u DOMAIN='app staging.herokapp.com'
时,我自动得到了错误的东西
.app staging.herokapp.com

我尽我所能,但毫无帮助。我尝试了当前的Firefox(83.0)和Chromium。最大的问题是CSRF令牌的检查无效。由于域不匹配,因此无效

csrftoken=E9sdyx5U61IaFP3YNJHk3ZKtnllkEnyZ6i9eimHYD31sn4qXRXv7FBDOpPfpWhyt; Domain=app-staging.herokuapp.com; expires=Fri, 19 Nov 2021 15:33:52 GMT; Max-Age=31449600; Path=/; SameSite=Lax; Secure

请不要建议我设置
CSRF\u COOKIE\u DOMAIN=None
。如果一个Django实例在更多域上运行,我需要解决同样的问题。这一点我们很快就要做了。

我做了一些深入的研究,并在csrf中间件上卡住了,请参阅下面的代码。在那里,
good\u referer
设置为
app staging.herokuapp.com:49461
,但
referer.netloc
仅为
app staging.herokuapp.com
,因此,函数
与域不匹配,因为它会抛出错误:
引用者检查失败-app-staging.herokuapp.com不匹配任何可信来源。“

资料来源:

我做了一点挖掘工作,在csrf中间件上卡住了,请参考下面的代码。在那里,
好的参考者
被设置为
应用程序登台。herokuapp.com:49461
,但是
参考者.netloc
只是
应用程序登台.herokuapp.com
,因此功能
是相同的域
不会匹配它们,因为它不匹配hr显示错误:
Referer检查失败-app-staging.herokuapp.com与任何可信来源不匹配。“

资料来源:

good_referer = (
    settings.SESSION_COOKIE_DOMAIN
    if settings.CSRF_USE_SESSIONS
    else settings.CSRF_COOKIE_DOMAIN
)
if good_referer is not None:
    server_port = request.get_port()
    if server_port not in ('443', '80'):
        good_referer = '%s:%s' % (good_referer, server_port)
else:
    try:
        # request.get_host() includes the port.
        good_referer = request.get_host()
    except DisallowedHost:
        pass

# Create a list of all acceptable HTTP referers, including the
# current host if it's permitted by ALLOWED_HOSTS.
good_hosts = list(settings.CSRF_TRUSTED_ORIGINS)
if good_referer is not None:
    good_hosts.append(good_referer)

if not any(is_same_domain(referer.netloc, host) for host in good_hosts):
    reason = REASON_BAD_REFERER % referer.geturl()
    return self._reject(request, reason)