所有路由的HTTPS重定向node.js / express - 安全问题

时间:2013-04-04 14:11:47

标签: node.js https 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);
});

这似乎工作正常。但是,因为在我有几个问题之前我没有涉足这个问题:

  1. 这是从http重定向到https的理想方式吗?
  2. 如果用户使用http路由,则在重定向之前,任何人都可以使用sslstrip之类的东西来嗅出会话信息。
  3. node:v0.8.2;表达:v3.05

3 个答案:

答案 0 :(得分:43)

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请求传输它们,从而使它们暴露在嗅探中。

答案 1 :(得分:2)

您可以简单地使用您的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);

答案 2 :(得分:0)

我使用这个简单的代码来重定向请求,具体取决于应用程序是在开发还是生产中。

FragmentManager mgr = PlaybackFrag.this.getActivity().getSupportFragmentManager();
if (mgr.getBackStackEntryCount() > 0) {
    // Want to go back to SocialViewFragment !!!    
    mgr.popBackStack(SocialViewFragment.FRAG_TAG, 0); // returns False - can't find the tag!                
}