我有一个Express网站运行在具有Nginx代理的背后,在使用csurf和不安全cookie进行csrf保护方面,一切在我的本地开发计算机上都运行良好。
此后,我已移至具有SSL证书的登台站点。现在我正在使用SSL,我想启用安全cookie。但是,无论何时我提交表单,csurf现在总是会使用无效的csrf令牌出错。
我这样设置我的快速会话:
app.set('trust proxy', 1)
app.use(session({secret:'secret' , resave:false,proxy:true, saveUninitialized:false, store:sessionStore, rolling:true, cookie:{secure:true}}))
//...other setup lines
let csrf = csurf()
app.use(csrf)
和我的nginx设置如下:
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header x-forwarded-proto https;
proxy_cache_bypass $http_upgrade;
据我所知,这一切都很好。我的Web应用程序是从GCP运行的,但我认为这没有什么区别。
我曾尝试清除计算机上的cookie等,以防某些内容被缓存在某处,但仍然无法正常工作。回到secure:false
可解决此问题。
我有一个捕获所有app.post
路由处理程序来验证csrf令牌,因为页面上有多种形式,并且在触发此路由后创建了新的csrf令牌,而且正如我之前提到的,在没有还可以保护Cookie。我也尝试将会话机密也传递给cookieParser()
,但无济于事,Express-session Secure Cookies not working处的解决方案也无效(例如设置resave:true
)。没有AJAX请求,要么是连续的POST
,而且令牌以正确的形式呈现。
这里有明显的东西我想念吗?
答案 0 :(得分:1)
我只是做了类似的事情,至少在我的设置中,我必须在我的trust proxy
中指定以下数组。
app.set('trust proxy', ['loopback', 'linklocal', 'uniquelocal']);
我也相信express希望看到所有标准的x-forwarded
标头,而不仅仅是-proto
。这是我为他们使用的配置:
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto $scheme;