在Heroku中完全禁用HTTP

时间:2015-03-13 11:44:44

标签: node.js security ssl heroku express

我们在Heroku中运行了一个node.js express应用程序。它处理身份验证,必须是高度安全的。

当我们收到HTTP请求时,我们强制重定向到HTTPS。但这似乎还不够。使用像sslstrip这样的工具,我们可以通过HTTP发布。

目前唯一的解决方案似乎是在Heroku上完全禁用HTTP。

怎么做?还有其他建议吗?

3 个答案:

答案 0 :(得分:6)

根据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();
});

答案 1 :(得分:2)

我们使用了 express-sslify npm包。添加了

item_id

答案 2 :(得分:1)

您可以测试请求是否使用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标题。

另外:如果您使用Heroku的自定义域

,请获取SSL证书