【问题标题】:CSRF django nginx with ssl from cloudflare带有来自 cloudflare 的 ssl 的 CSRF django nginx
【发布时间】:2016-04-09 12:32:00
【问题描述】:

背景

我正在尝试将我的 Django 应用程序配置为使用 cloudflare 提供的 ssl。我的设置与this answer 大致相同,并且遵循了相同的解决方案。

问题:

这已经让我死了好几个星期(请帮忙!)因为我不是网络/安全人员,只需要一个避免我挖眼睛的解决方案但请确保网站安全。

我目前遇到 https://www.domain.co.ukhttps://domain.co.uk 不匹配的 CSRF 问题

配置

Settings.py

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
USE_X_FORWARDED_HOST = True

nginx:

server {

    listen 80 default_server;

    server_name domain.co.uk www.domain.co.uk;
    access_log off;

    location /static/ {
        alias /static/;
    }


    location / {
            proxy_pass http://127.0.0.1:8000;
            proxy_set_header X-Forwarded-Host $server_name;
            proxy_set_header X-Real-IP $remote_addr;
            add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';

            proxy_set_header X-Scheme $scheme;
            proxy_set_header X-Forwarded-Protocol $scheme;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            }
}

Cloudflare DNS:

A domain.co.uk  points to <ip> Automatic
CNAME www is an alias of domain.co.uk Automatic 

奖金

此外,我还有 .com 域,想知道如何最好地设置它,使其也是 ssl。

【问题讨论】:

    标签: django ssl nginx csrf


    【解决方案1】:

    您需要设置发送 CSRF cookie 的域。尝试在您的设置中将CSRF_COOKIE_DOMAIN 设置为".domain.co.uk"CSRF_COOKIE_SECURE 设置为True

    第 4 点值得一读 https://docs.djangoproject.com/en/1.9/ref/csrf/#how-it-works

    【讨论】:

      【解决方案2】:

      我个人会将您的配置放在 nginx 端,而不是 Django 端。这样,当您进行本地开发时,您可以验证您的 CSRF 并确保一切正常。确保它确实有效...如果没有 nginx 配置就无法让它在本地工作,那么还有另一个与您的服务器配置无关的问题。然后应该可以在没有特定 Django 设置或库的情况下使服务器上的一切都以相同的方式工作。

      对于您的 nginx 配置,解决方案可能是给我们一个 answer like this 到 301 重定向所有 www。到非www,以及将所有http重定向到https。

      然后,你可以在你的 nginx 中重命名这一行:

      server_name domain.co.uk www.domain.co.uk;
      

      到:

      server_name domain.co.uk;  # This assumes you're directing www. to non-www
      

      这应该可以解决您的 CSRF 问题...因为您只会引用一个域而不是上面的两个域。

      301 重定向的额外好处是您可以避免对自然搜索的任何重复内容处罚。

      [编辑] 看起来您正在使用 CNAME 重定向 www。到非 www,因此您可以简单地使用我上面引用的答案中的 https 到非 https 301 重定向。

      【讨论】:

        猜你喜欢
        • 2020-08-13
        • 2021-07-25
        • 2018-08-23
        • 2015-12-21
        • 1970-01-01
        • 2019-03-22
        • 2015-11-23
        • 2022-01-05
        • 1970-01-01
        相关资源
        最近更新 更多