所有路由的 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 重定向不起作用。

登录后 Laravel 基本身份验证重定向到 HTTPS 路由

当所有路由根据条件动态加载时如何重定向到路由?

重定向路由器中的所有路由

Symfony 3 将所有路由重定向到当前语言环境版本

如何仅使用 AWS 服务重定向流量?