2015-03-13 3 views
4

У нас есть приложение node.js express, работающее в Heroku. Он обрабатывает аутентификацию и должен быть очень безопасным.Отключить HTTP полностью в Heroku

Мы вынуждены перенаправлять HTTPS, когда получаем HTTP-запрос. Но этого, похоже, недостаточно. С помощью таких инструментов, как sslstrip, мы можем использовать POST через HTTP.

Единственное решение под рукой, похоже, полностью отключает HTTP на Heroku.

Как это сделать? Есть ли другие предложения?

+0

Как вы перенаправили перенаправление? –

+2

Мы использовали пакет «express-sslify» npm. Добавлено 'app.use (enforce.HTTPS (true));' – siliconsenthil

ответ

3

Согласно OWASP, вы не должны перенаправлять с HTTP на HTTPS. См. https://www.owasp.org/index.php/Transport_Layer_Protection_Cheat_Sheet#Rule_-REMOVED-_Do_Not_Perform_Redirects_from_Non-TLS_Page_to_TLS_Login_Page для более подробной информации.

Я думаю, что лучшим решением было бы отклонить запрос сообщением, позволяющим пользователю узнать, почему. Вы должны сделать это в функции промежуточного программного обеспечения. Реальный код статуса вы возвращаетесь спорен, но что-то, как это должно работать:

app.use(function(req, res, next) { 
    if(req.protocol !== 'https') { 
     return res.status(403).send({message: 'SSL required'}); 
    } 
    // allow the request to continue 
    next(); 
}); 
0

Вы можете проверить, используется ли запрос HTTPS, а затем принудительно редирект с использованием протокола HTTPS, если это требуется (обратите внимание на озабоченности указала @Ryan о перенаправлении и безопасности). С помощью Heroku вы можете проверить заголовок заголовка req заголовков x-forwarded-proto, чтобы убедиться, что это https. Вот пример:

var express = require('express'); 
var env = process.env.NODE_ENV || 'development'; 
var forceSSL = function (req, res, next) { 
    if (req.headers['x-forwarded-proto'] !== 'https') { 
    return res.redirect(['https://', req.get('Host'), req.url].join('')); 
    } 
    return next(); 
}; 

var app = express(); 
// in your app-level configurations 
if (env === 'production') app.use(forceSSL); 

Примечания: при балансировке нагрузки Heroku является определяющим заголовком x-forwarded-proto, прежде чем она попадет ваше приложение.

Также: получите сертификат SSL, если вы используете собственный домен с Heroku

Смежные вопросы