【问题标题】:CSRF verification failed behind Route 53Route 53 后面的 CSRF 验证失败
【发布时间】:2022-01-04 00:38:36
【问题描述】:

我有一个使用 Gunicorn 和 Nginx 的 dockerized Django 应用程序。使用 localhost 登录管理页面时,没有出现 CSRF 错误。在使用 Route 53 作为代理服务器(https 重定向到 http)在 Amazon EC2 上运行 docker 时,我在登录时收到 CSRF 错误。我在我的 settings.py 文件中注意到以下内容(我添加了 SECURE_SSL_REDIRECT = False 但它没有效果):

ALLOWED_HOSTS = ['localhost', '.website_name.ca']

SECURE_SSL_REDIRECT = False

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'The6ixDjango.apps.The6IxdjangoConfig',
]

MIDDLEWARE = [
    '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',
]

鉴于我在前端有 Route 53,删除 MIDDLEWARE 列表中的 csrf 中间件引用是否“安全”?

【问题讨论】:

    标签: django nginx amazon-route53


    【解决方案1】:

    由于您使用将 https 请求转换为 http 的代理,您需要将 Django 配置为允许来自不同方案 (since Django 4.0) 的 POST 请求,方法是将其添加到 settings.py:

    CSRF_TRUSTED_ORIGINS = ["https://yourdomain.com", "https://www.yourdomain.com"]
    

    如果这不能解决您的问题,您可以在生产环境中临时设置DEBUG = True,然后重试。在错误页面上,您将看到可以在此处发布的“失败原因”。 (您写的是“登录时的 CSRF 错误”,但有 9 个可能的错误,了解实际错误会很有用。)

    SECURE_SSL_REDIRECT 应该是 False 确实(因为 Route 53 将为您处理重定向)但 False 是默认值,因此您可以简单地省略 SECURE_SSL_REDIRECT 设置。

    从MIDDLEWARE 列表中删除CsrfViewMiddleware 绝对是不安全。 Route 53 不会为您提供针对 CSRF 攻击的等效保护。

    【讨论】:

    • 这修复了它!非常感谢您的帮助!
    猜你喜欢
    • 2016-04-16
    • 2014-01-09
    • 2012-09-08
    • 2015-06-02
    • 1970-01-01
    • 2017-10-21
    相关资源
    最近更新 更多