在Heroku中完全禁用HTTP

我们有一个在Heroku中运行的node.js快速应用程序。 它处理身份validation,必须是一个高度安全的。

当我们收到HTTP请求时,我们强制redirect到HTTPS。 但是这似乎还不够。 像sslstrip这样的工具,我们可以通过HTTP POST。

唯一的解决scheme似乎是在Heroku上完全禁用HTTP。

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

根据OWASP,你不应该从HTTPredirect到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 。

我认为更好的解决办法是通过让用户知道原因的消息来拒绝请求。 你应该能够在中间件function中做到这一点。 你返回的实际状态码是有争议的,但这样的事情应该工作:

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

您可以testing一个请求是否使用https,然后使用https强制redirect(如果需要的话)(请注意@Ryan指出的有关redirect和安全性的问题)。 用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证书