2010-08-18 18 views
11

Lässt nur die Vertrauenswürdigkeit, die der Server mit dem Benutzer haben.Session Hijacking und PHP

Session Fixierung: die Fixierung zu vermeiden I "session_regenerate_id()" NUR in Authentifizierung (login.php)

Session sidejacking verwenden: SSL-Verschlüsselung für den gesamten Standort.

Bin ich sicher?

Danke.

+0

Welche Art von Website ist das? –

+9

@MrXexpressed eine Website, wo die Entwickler nicht wollen, dass es gehackt wird. – rook

+0

@The Rook, ich sprach mit dem OP, es war eine echte Frage, Ihr Kommentar ist sowohl witzig als auch völlig nutzlos. –

Antwort

28

OWASP A3-Broken Authentication and Session Management lesen. Lesen Sie auch über OWASP A5-CSRF, die manchmal als "Session Riding" bezeichnet wird.

Sie sollten diesen Code in einer Datei php-Header verwenden:

ini_set('session.cookie_secure',1); 
ini_set('session.cookie_httponly',1); 
ini_set('session.use_only_cookies',1); 
session_start(); 

Dieser Code vermeidet session fixation. Es hilft auch gegen xss vor Zugriff document.cookie zu schützen, was eine Möglichkeit ist, dass Session Hijacking auftreten kann. Das Erzwingen von HTTPS-Cookies ist eine gute Möglichkeit, OWASP A9-Insufficient Transport Layer Protection zu adressieren. Diese Art der Verwendung von HTTPS wird manchmal "sichere Cookies" genannt, was ein schrecklicher Name dafür ist. Auch STS ist eine sehr coole Sicherheitsfunktion, aber nicht alle Browser unterstützen es (noch).

+1

Ihre Antwort verdient mindestens eine +10, und mit meiner Stimme haben Sie es verstanden. Ein paar Fragen, nur um sicherzugehen, dass ich verstanden habe: 1) 'cookie_secure' würde mich zwingen, immer auf https zu arbeiten, wenn es in der Sitzung ist, nicht wahr ?! 2) Was macht 'cookie_httponly'? Ich lese PHP-Erklärung, aber ich bekomme nicht, wenn es sagt, dass JS Formular lesen Cookies verhindert, eigentlich sollten Cookies von JS in vielen Umständen gelesen werden. Danke und FYI: seit PHP 5.3.0 'session.use_only_cookies' ist 1 standardmäßig http://it.php.net/manual/en/session.configuration.php#ini.session.use-only-cookies –

2

Ich würde auch vorschlagen, die Benutzer-Agent und IP-Informationen in der Sitzung zu speichern und es bei jeder Anfrage zu überprüfen. Es ist nicht kugelsicher, aber es ist eine ziemlich deutliche Steigerung der Robustheit. Während UA-Schmieden ist wirklich einfach, IP-Schmieden, obwohl möglich, ist viel schwieriger ... Aber Sie haben möglicherweise Probleme mit Benutzern, die hinter einem Round-Robin-IP-System wie AOL-Benutzer sind ...

+5

" IP-Schmieden "oder häufiger als ip-Spoofing, ist unmöglich für eine TCP-Verbindung über das Internet aufgrund der Drei-Wege-Handshake. Die IP-Adresse eines legitimen Benutzers kann sich jedoch während einer Sitzung aufgrund von Load Balancern in einem Unternehmensnetzwerk oder dem Ändern von WLAN-Hotspots ändern. – rook

+0

Es ist durchaus möglich. Es erfordert nur einen MITM-Style-Angriff (bei dem der Angreifer Zugang zu einem der Endpunkt-Router erhält und dann tun kann, was er möchte) ... – ircmaxell

+1

Es ist nicht "Schmieden", wenn Sie auf Pakete zugreifen können, die an diese IP weitergeleitet werden. –

0

die beste Praxis i habe jemals gefunden ist die Sitzungsdaten in der Datenbank oder in einer Textdatei zu speichern. Die Datenbank wird Benutzer-Agent haben, und IP-Aufnahme und überprüfen Sie jede Anfrage für sicherstellen, dass die Sitzung noch nie von anderen entführt worden.

Zum Beispiel, wie Sitzung in der Datenbank gespeichert ist, können Sie die Implementierung in der Codeigntier Session-Bibliothek sehen. meiner Meinung nach auf diese Weise ziemlich sicher zu verhindern, dass jemand Sitzung hijact.

+3

Das Überprüfen des Benutzeragenten ist bedeutungslos, da es sich um eine vom Angreifer gesteuerte Variable handelt. Das Speichern der Sitzungs-ID in der Datenbank bedeutet, dass die sql-Injection dem Angreifer sofortigen Zugriff auf das System gewährt, so dass er keinen Passwort-Hash zum Anmelden brechen muss. Das Überprüfen der IP-Adresse ist fehleranfällig, da sich dies auf einem legitimen System ändern kann, z. B. wenn er sich hinter einem Lastenausgleich in einem Unternehmensnetzwerk befindet. – rook

+0

@Rook - Sie gehen davon aus, dass die Datenbank anfällig für SQL-Injection ist. Die richtige Verwendung vorbereiteter Anweisungen oder gespeicherter Prozeduren und die ordnungsgemäße Desinfektion von Parametern erlauben keine SQL-Injektion. – AgmLauncher

+0

@AgmLauncher Dies ist das Äquivalent zum Speichern eines Passwortes im Klartext in der Datenbank. Man muss das Scheitern planen. – rook