Route 53 后的 CSRF 验证失败

CSRF verification failed behind Route 53

我有一个 docker 化的 Django 应用程序,它使用 Gunicorn 和 Nginx。使用 localhost 登录管理页面时,没有出现 CSRF 错误。当 运行 docker 在 Amazon EC2 上使用 Route 53 作为代理服务器(https 重定向到 http)时,我在登录时收到 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,是否'safe' 删除 MIDDLEWARE 列表中的 csrf 中间件引用?

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

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

如果这不能解决您的问题,您可以在生产中暂时设置DEBUG = True并重试。在错误页面上,您会看到“给出的失败原因”,您可以在此处 post。 (你写了关于“登录时的 CSRF 错误”,但有 9 个可能的错误,知道实际错误会很有用。)

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

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