2015-03-13 39 views
4

我们有一个在Heroku中运行的node.js快速应用程序。它处理身份验证并且必须是高度安全的。在Heroku中完全禁用HTTP

当我们收到HTTP请求时,我们强制重定向到HTTPS。但这似乎还不够。有了像sslstrip这样的工具,我们可以通过HTTP进行POST。

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

如何做到这一点?还有其他建议吗?

+0

你怎么强制重定向获得SSL证书? – 2015-03-13 12:03:17

+2

我们使用了'express-sslify'npm软件包。添加了'app.use(enforce.HTTPS(true));' – siliconsenthil 2015-03-13 12:21:12

回答

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,然后如果这是必需的(请注意关注中指出@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的