2013-04-04 15 views
17

Ich habe vor kurzem einen Versuch unternommen, HTTPS auf einem Knoten/Express-Server einzurichten.HTTPS-Umleitung für alle Routen node.js/express - Sicherheitsbedenken

// force https redirect 
var https_redirect = function(req, res, next) { 
    if (req.secure) { 
    if(env === 'development') { 
     return res.redirect('https://localhost:3000' + req.url); 
    } else { 
     return res.redirect('https://' + req.headers.host + req.url); 
    } 
    } else { 
    return next(); 
    } 
}; 

app.get('*', function(req, res, next) { 
    https_redirect(req, res, next); 
}); 

Dies scheint zu funktionieren gut: Ich habe erfolgreich umgeleitet werden alle Routen verwenden https mit dem Code unten geführt werden. Da ich mich jedoch nicht vorher damit beschäftigt habe, bevor ich ein paar Fragen habe:

  1. Ist dies der ideale Weg um von http zu https umzuleiten?
  2. Wenn ein Benutzer die HTTP-Route verwendet, ist es vor der Weiterleitung für jeden möglich, etwas wie sslstrip zu verwenden, um Session-Informationen zu erschnüffeln.

Knoten: v0.8.2; ausdrücken: v3.05

Antwort

42
function requireHTTPS(req, res, next) { 
    if (!req.secure) { 
     //FYI this should work for local development as well 
     return res.redirect('https://' + req.get('host') + req.url); 
    } 
    next(); 
} 

app.use(requireHTTPS); 
app.get('/', routeHandlerHome); 

Der Middleware-Ansatz funktioniert, weil Express Die Middleware wird in der Reihenfolge ausgeführt, in der sie hinzugefügt wurde, bevor sie den Router ausführt, und im Allgemeinen ist diese Art der standortweiten Richtlinie sauberer als Middleware im Vergleich zu einer Platzhalterroute.

In Bezug auf Frage 2 über Sniffing-Session-Cookies, die durch das Setzen der Cookies als secure markiert werden müssen. Wenn sie nicht als sicher markiert wurden, überträgt der Browser sie auch mit HTTP-Anfragen, wodurch sie dem Sniffing ausgesetzt werden.

+0

Peter danke für die Antwort. Das hat wirklich geholfen. – los7world

+2

Das ist großartig, aber es ist etwas problematisch für die Entwicklung, wenn Sie Nicht-Standard verwenden (80 für HTTP, 443 für HTTPS), weil es versucht, zu 'https: // localhost: [PORT]' umzuleiten. Eine Problemumgehung besteht darin, eine 'SSL_PORT'-Umgebungsvariable in der' Entwicklungsumgebung 'zu setzen und, falls definiert, den Port zu ersetzen. Siehe [hier] (https://gist.github.com/gingi/47df42a45bb1653002ee#file-gistfile1-js-L5-L8) für das modifizierte Snippet. – Gingi

+0

hei, wie kann ich nach diesem Vorgang eine Verbindung mit einem Front-End-Client herstellen? Vielen Dank ! – alexsc

1

Sie können einfach Ihre https_redirect Funktion als (wenn auch ein wenig modifiziert), um automatisch alle Ihre sicheren Anforderungen umleiten:

// force https redirect 
var https_redirect = function() { 
    return function(req, res, next) { 
    if (req.secure) { 
     if(env === 'development') { 
     return res.redirect('https://localhost:3000' + req.url); 
     } else { 
     return res.redirect('https://' + req.headers.host + req.url); 
     } 
    } else { 
     return next(); 
    } 
    }; 
}; 
app.use(https_redirect()); 

app.get('/', routeHandlerHome); 
+0

Hey Josh. Danke für die Antwort. Können Sie hervorheben, wie Ihr Ansatz speziell mit App funktioniert? Verwendung würde im Vergleich zu meiner Implementierung funktionieren. – los7world

+0

@ los7world: Mit app.use() richtest du gezielt eine Middleware ohne Routenanpassung ein, so dass alle deine Routen durchfahren werden. – red

+0

Verstanden. Danke für deinen Beitrag. – los7world

0

Ich benutze diesen einfachen Code, um Anfragen umzuleiten, abhängig davon, ob die Anwendung in Entwicklung oder Produktion ist.

// force https redirect 
var forceHTTPS = function() { 
    return function(req, res, next) { 
    if (!req.secure) { 
     if (app.get('env') === 'development') { 
     return res.redirect('https://localhost:3001' + req.url); 
     } else { 
     return res.redirect('https://' + req.headers.host + req.url); 
     } 
    } else { 
     return next(); 
    } 
    }; 
}; 
Verwandte Themen