Подтвердить что ты не робот

Переадресация HTTPS для всех маршрутов node.js/express - Проблемы безопасности

Недавно я получил удар по настройке HTTPS на сервере node/express. Мне удалось перенести все маршруты на использование 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, чтобы вынюхивать информацию о сеансе.

node: v0.8.2; экспресс: v3.05

4b9b3361

Ответ 1

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 будет запускать промежуточное программное обеспечение в добавленном порядке до того, как он запустит маршрутизатор, и, в общем, такая политика на уровне сайта более чиста, чем промежуточное ПО и шаблон подстановочного знака.

Относительно вопроса 2 об использовании файлов cookie сеанса, которые должны быть устранены путем маркировки файлов cookie как secure при их установке. Если они не были помечены как безопасные, браузер также будет передавать их с HTTP-запросами, тем самым подвергая их обнюхиванию.

Ответ 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);

Ответ 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();
    }
  };
};