2015-03-13 22 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的