所有路由的 HTTPS 重定向 node.js/express - 安全问题
Posted
技术标签:
【中文标题】所有路由的 HTTPS 重定向 node.js/express - 安全问题【英文标题】:HTTPS redirection for all routes node.js/express - Security concerns 【发布时间】:2013-03-26 16:09:21 【问题描述】:我最近尝试在 node/express 服务器上设置 HTTPS。我已经成功地使用以下代码将所有路由重定向到使用 https:
// force https redirect
var https_redirect = function(req, res, next)
if (req.secure)
if(env === 'development')
return res.redirect('https://localhost:3000' + req.url);
else
return res.redirect('https://' + req.headers.host + req.url);
else
return next();
;
app.get('*', function(req, res, next)
https_redirect(req, res, next);
);
这似乎工作正常。但是,由于在我有几个问题之前我还没有涉足这个问题:
-
这是从 http 重定向到 https 的理想方式吗?
如果用户使用 http 路由,那么任何人都可以在重定向之前使用 sslstrip 之类的东西来嗅探会话信息。
节点:v0.8.2;快递:v3.05
【问题讨论】:
【参考方案1】:您可以简单地使用您的 https_redirect 函数(尽管稍作修改)来自动重定向您的所有安全请求:
// force https redirect
var https_redirect = function ()
return function(req, res, next)
if (req.secure)
if(env === 'development')
return res.redirect('https://localhost:3000' + req.url);
else
return res.redirect('https://' + req.headers.host + req.url);
else
return next();
;
;
app.use(https_redirect());
app.get('/', routeHandlerHome);
【讨论】:
嗨乔希。谢谢回复。你能强调一下你的方法是如何专门使用 app 的吗?与我的实现相比,使用会起作用。 @los7world:使用 app.use(),您专门设置了一个没有路由匹配的中间件,因此您的所有路由都将通过它。 明白。感谢您的意见。 第一个条件不应该是!req.secure
【参考方案2】:
function requireHTTPS(req, res, next)
if (!req.secure)
//FYI this should work for local development as well
return res.redirect('https://' + req.get('host') + req.url);
next();
app.use(requireHTTPS);
app.get('/', routeHandlerHome);
中间件方法会起作用,因为 express 将在运行路由器之前按照添加的顺序运行中间件,并且通常这种站点范围的策略作为中间件与通配符路由相比更清晰。
关于关于嗅探会话 cookie 的问题 2,必须通过在设置 cookie 时将它们标记为 secure
来解决。如果它们没有被标记为安全,浏览器也会将它们与 HTTP 请求一起传输,从而使它们暴露在嗅探之下。
【讨论】:
这很好,但如果您使用非标准(HTTP 为 80,HTTPS 为 443),这对开发来说有点问题,因为它会尝试重定向到https://localhost:[PORT]
。一种解决方法是在development
环境中设置SSL_PORT
环境变量,如果已定义,请替换端口。修改后的 sn-p 见here。
嘿,这样做后如何连接前端客户端?谢谢!
请注意,在 heroku 上您必须使用 req.headers['x-forwarded-proto'] !== 'https'
否则这将不起作用。见***.com/questions/7185074/…【参考方案3】:
我使用这个简单的代码来重定向请求,具体取决于应用程序是处于开发阶段还是生产阶段。
// force https redirect
var forceHTTPS = function ()
return function(req, res, next)
if (!req.secure)
if (app.get('env') === 'development')
return res.redirect('https://localhost:3001' + req.url);
else
return res.redirect('https://' + req.headers.host + req.url);
else
return next();
;
;
【讨论】:
以上是关于所有路由的 HTTPS 重定向 node.js/express - 安全问题的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5 - 发布路由上的 htaccess HTTPS 重定向不起作用。