繁体   English   中英

Django:“禁止 (403) CSRF 验证失败。请求中止。” 在 Docker 生产中

[英]Django: "Forbidden (403) CSRF verification failed. Request aborted." in Docker Production

每当我尝试登录 Django 管理员或尝试在我的 Django 应用程序中注册时,我都会收到此错误。

我在 Docker 和http服务站点中使用生产。 不管我知道什么,这个问题的出现是因为它通过http而不是https

这是我的生产设置.py:

SECURE_HSTS_SECONDS = 518400
SECURE_HSTS_INCLUDE_SUBDOMAINS = env.bool('DJANGO_SECURE_HSTS_INCLUDE_SUBDOMAINS', default=True)
SECURE_CONTENT_TYPE_NOSNIFF = env.bool('DJANGO_SECURE_CONTENT_TYPE_NOSNIFF', default=True)
# SECURE_BROWSER_XSS_FILTER = True
SESSION_COOKIE_SECURE = False
SESSION_COOKIE_HTTPONLY = True
SECURE_SSL_REDIRECT = env.bool('DJANGO_SECURE_SSL_REDIRECT', default=False)
CSRF_COOKIE_SECURE = False
CSRF_COOKIE_HTTPONLY = True
X_FRAME_OPTIONS = 'DENY'

我知道我必须对此设置进行一些更改才能使其正常工作,但我不知道是哪一个。

试试这个问题的答案:

您需要在表单中添加{%csrf_token%}

https://docs.djangoproject.com/en/1.4/ref/contrib/csrf/

像那样 :

<form>
    {% csrf_token %}
    <anything_else>
</form>

另外,每次使用render_to_response时,都必须使用RequestContext(request):

return render_to_response("login.html",
    {"registration_id":registration_id},
    context_instance=RequestContext(request))

而且您必须导入身份验证并登录:

from django.contrib.auth import authenticate, login

检查您的错误消息是否包含如下行:

  Origin checking failed - http://my.web.site.com does not match any trusted origins.

如果是这种情况,您的问题可能是您在 Docker 内部运行的 django 代码将请求视为来自不同站点(Docker 外部的站点)并抱怨它。

正确的解决方案是信任您的网站。 在你的settings.py添加这样一行:

CSRF_TRUSTED_ORIGINS = [
    'http://my.web.site.com',
]

有关更多详细信息,请参阅 Django 文档:跨站点请求伪造保护

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM