我們有一個在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