我们有一个在Heroku中运行的node.js快速应用程序。它处理身份验证并且必须是高度安全的。在Heroku中完全禁用HTTP
当我们收到HTTP请求时,我们强制重定向到HTTPS。但这似乎还不够。有了像sslstrip这样的工具,我们可以通过HTTP进行POST。
唯一的解决方案似乎是在Heroku上完全禁用HTTP。
如何做到这一点?还有其他建议吗?
我们有一个在Heroku中运行的node.js快速应用程序。它处理身份验证并且必须是高度安全的。在Heroku中完全禁用HTTP
当我们收到HTTP请求时,我们强制重定向到HTTPS。但这似乎还不够。有了像sslstrip这样的工具,我们可以通过HTTP进行POST。
唯一的解决方案似乎是在Heroku上完全禁用HTTP。
如何做到这一点?还有其他建议吗?
根据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();
});
您可以测试是否请求使用HTTPS,然后如果这是必需的(请注意关注中指出@Ryan使用HTTPS强制重定向关于重定向和安全)。使用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证书? – 2015-03-13 12:03:17
我们使用了'express-sslify'npm软件包。添加了'app.use(enforce.HTTPS(true));' – siliconsenthil 2015-03-13 12:21:12