2013-04-04 3 views
17

Недавно я принял удар по настройке HTTPS на узле/экспресс-сервере. Я успешно удалось перенаправить все маршруты, которые используют протокол HTTPS, используя код ниже:Переадресация HTTPS для всех маршрутов node.js/express - Проблемы с безопасностью

// 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

ответ

42
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); 

Промежуточного подход будет работать, потому что экспресс будет запускать промежуточное программное обеспечение в добавленном порядке до того, как он запустит маршрутизатор, и в целом такой вид политики на сайте является более чистым, чем промежуточное программное обеспечение и шаблон подстановочного знака.

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

+0

Peter благодарит за ответ. Это действительно помогло. – los7world

+2

Это замечательно, но это немного проблематично для разработки, если вы используете нестандартные (80 для HTTP, 443 для HTTPS), потому что он пытается перенаправить на 'https: // localhost: [PORT]'. Обходным решением является установка переменной среды SSL_PORT в среде 'development', и, если она определена, замените порт. См. [Здесь] (https://gist.github.com/gingi/47df42a45bb1653002ee#file-gistfile1-js-L5-L8) для модифицированного фрагмента. – Gingi

+0

hei, как я могу подключиться к интерфейсу клиента после этого? Благодаря ! – alexsc

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); 
+0

Эй, Джош. Спасибо за ответ. Можете ли вы подчеркнуть, как ваш подход конкретно с приложением. использование будет работать по сравнению с моей реализацией. – los7world

+0

@ los7world: с помощью app.use() вы настраиваете промежуточное программное обеспечение без соответствия маршрута, таким образом, все ваши маршруты пройдут через него. – red

+0

Понял. Спасибо за ваш вклад. – los7world

0

Я использую этот простой код для перенаправления запросов в зависимости от того, находится ли приложение в разработке или производстве.

// 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(); 
    } 
    }; 
}; 
Смежные вопросы