【问题标题】:HTTPS redirection for all routes node.js/express - Security concerns所有路由的 HTTPS 重定向 node.js/express - 安全问题
【发布时间】: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);
});

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

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

节点:v0.8.2;快递:v3.05

【问题讨论】:

    标签: node.js https express


    【解决方案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' 否则这将不起作用。见stackoverflow.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();
        }
      };
    };
    

    【讨论】:

      猜你喜欢
      • 2014-12-27
      • 2019-09-02
      • 1970-01-01
      • 2019-08-23
      • 1970-01-01
      • 2022-08-22
      • 1970-01-01
      • 2020-11-11
      • 2013-01-14
      相关资源
      最近更新 更多