所有路由的HTTPSredirectnode.js / express – 安全问题

我最近在一个节点/快递服务器上设置了HTTPS。 我已经成功设法redirect所有的路线使用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); }); 

这似乎工作正常。 不过,由于我还没有涉及到这个问题,所以我有几个问题:

  1. 这是从httpredirect到https的理想方式吗?
  2. 如果用户使用http路由,在redirect之前,任何人都可以使用像sslstrip这样的东西来嗅探会话信息。

节点:v0.8.2; expression:v3.05

 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,必须通过在设置cookies时将其标记为secure来解决。 如果它们没有被标记为安全的,那么浏览器也会通过HTTP请求传输它们,从而暴露它们的嗅探。

您可以简单地使用您的https_redirectfunction(虽然有点修改)作为自动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); 

我使用这个简单的代码redirect请求取决于应用程序是否在开发或生产。

 // 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(); } }; };