nginx Django:CSRF验证失败,请求中止,生产中没有域名

omvjsjqw  于 2023-03-17  发布在  Nginx
关注(0)|答案(2)|浏览(604)

bounty将在3天后过期。回答此问题可获得+50的声誉奖励。Nikko正在寻找来自声誉良好来源的答案

我在Docker环境下运行Nginx后面的Django应用程序,我的问题和下面的帖子差不多:Django returning "CSRF verification failed. Request aborted. " behind Nginx proxy locally .
当我知道我必须在设置中添加CSRF_TRUSTED_ORIGINS时,因为我使用的是Django4.X版本,我添加了我的localhost

CSRF_TRUSTED_ORIGINS = [
    'http://localhost',
    'http://localhost:3000',
    'https://example.com',
]

当容器部署在本地时,我可以登录到管理员。但是,当我将其部署到生产环境时,我仍然收到错误:
CSRF验证失败。请求已中止。
我将它部署在谷歌计算引擎中。该应用程序还没有域名。因此,我使用其机器的外部地址访问该应用程序:http://XX.XX.XX.XX/admin。我应该将此地址添加到我的CSRF_TRUSTED_ORIGINS吗?我的理解是,这与添加本地主机http://localhost相同,因为我访问的是主机的地址。

CSRF_TRUSTED_ORIGINS = [
    'http://localhost',
    'http://localhost:3000',
    'https://example.com',
    'http://XX.XX.XX.XX'
]

如果我将其部署到另一台具有不同地址的机器上会怎样?我应该再次添加它吗?有没有其他方法可以允许CSRF而不专门添加地址,因为如果我在主机中更改/迁移,这将是乏味的?
这是我的nginx配置,如果它是任何帮助。

upstream api {
    server container_name:8000;
}

server {
    listen 80;

    location / {
        proxy_pass http://api;
    }

    location /static/ {
        alias /static/;
    }
}
pbwdgjma

pbwdgjma1#

您关于添加另一台计算机的IP地址的问题,您还需要将其添加到CSRF_TRUSTED_ORIGINS设置中。没有其他方法可以在不将来源显式添加到可信列表中的情况下允许CSRF。
如果你不想将特定IP地址或域名添加到受信任列表,可以通过从MIDDLEWARE设置中删除CsrfViewMiddleware中间件来完全禁用CSRF保护。但是,不建议这样做,因为这可能会使你的应用容易受到CSRF攻击。

iecba09b

iecba09b2#

在生产中,Django的设置会有一些不同。你可以尝试以下两点:
1.在setting.py中添加CSRF_TRUSTED_ORIGINS = ['https://your-domain.com']
1.在setting.py中添加STATIC_URL = 'static/'或任何你在nginx配置中更改的路径。
因为你是在代理后面使用它,所以js和CSS有可能无法正常工作。在这种情况下,#2是有用的。

相关问题