我们在Heroku中运行了一个node.js express应用程序。它处理身份验证,必须是高度安全的。
当我们收到HTTP请求时,我们强制重定向到HTTPS。但这似乎还不够。使用像sslstrip这样的工具,我们可以通过HTTP发布。
目前唯一的解决方案似乎是在Heroku上完全禁用HTTP。
怎么做?还有其他建议吗?
答案 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证书