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/;
}
}
2条答案
按热度按时间pbwdgjma1#
您关于添加另一台计算机的IP地址的问题,您还需要将其添加到CSRF_TRUSTED_ORIGINS设置中。没有其他方法可以在不将来源显式添加到可信列表中的情况下允许CSRF。
如果你不想将特定IP地址或域名添加到受信任列表,可以通过从MIDDLEWARE设置中删除CsrfViewMiddleware中间件来完全禁用CSRF保护。但是,不建议这样做,因为这可能会使你的应用容易受到CSRF攻击。
iecba09b2#
在生产中,Django的设置会有一些不同。你可以尝试以下两点:
1.在
setting.py
中添加CSRF_TRUSTED_ORIGINS = ['https://your-domain.com']
1.在
setting.py
中添加STATIC_URL = 'static/'
或任何你在nginx配置中更改的路径。因为你是在代理后面使用它,所以js和CSS有可能无法正常工作。在这种情况下,#2是有用的。