Dies gilt insbesondere für die Verwendung eines Client-Sitzungscookies zur Identifizierung einer Sitzung auf dem Server.
Ist die beste Antwort, um die SSL / HTTPS-Verschlüsselung für die gesamte Website zu verwenden, und Sie haben die beste Garantie, dass kein Mann in den mittleren Angriffen in der Lage ist, ein vorhandenes Client-Sitzungs-Cookie zu schnüffeln?
Und vielleicht am zweitbesten, um eine Art Verschlüsselung für den Sitzungswert selbst zu verwenden, der in Ihrem Sitzungscookie gespeichert ist?
Wenn ein böswilliger Benutzer physischen Zugriff auf einen Computer hat, kann er dennoch das Dateisystem überprüfen, um ein gültiges Sitzungscookie abzurufen und damit eine Sitzung zu entführen.
Das SSL hilft nur bei Schnüffelangriffen. Wenn ein Angreifer Zugriff auf Ihren Computer hat, gehe ich davon aus, dass er auch Ihr sicheres Cookie kopieren kann.
Stellen Sie zumindest sicher, dass alte Cookies nach einer Weile ihren Wert verlieren. Selbst ein erfolgreicher Hijaking-Angriff wird vereitelt, wenn der Cookie nicht mehr funktioniert. Wenn der Benutzer ein Cookie aus einer Sitzung hat, die sich vor mehr als einem Monat angemeldet hat, muss er sein Kennwort erneut eingeben. Stellen Sie sicher, dass die alte Sitzungs-UUID nie wieder verwendet werden kann, wenn ein Benutzer auf den Link "Abmelden" Ihrer Site klickt.
Ich bin mir nicht sicher, ob diese Idee funktioniert, aber hier ist: Fügen Sie Ihrem Sitzungscookie eine Seriennummer hinzu, möglicherweise eine Zeichenfolge wie diese:
SessionUUID, Seriennummer, aktuelles Datum / Uhrzeit
Verschlüsseln Sie diese Zeichenfolge und verwenden Sie sie als Sitzungscookie. Ändern Sie regelmäßig die Seriennummer - möglicherweise, wenn der Cookie 5 Minuten alt ist, und geben Sie ihn dann erneut aus. Sie können es sogar bei jeder Seitenansicht neu ausgeben, wenn Sie möchten. Notieren Sie auf der Serverseite die letzte Seriennummer, die Sie für diese Sitzung ausgegeben haben. Wenn jemand jemals ein Cookie mit der falschen Seriennummer sendet, bedeutet dies, dass ein Angreifer möglicherweise ein Cookie verwendet, das er zuvor abgefangen hat. Machen Sie daher die Sitzungs-UUID ungültig und bitten Sie den Benutzer, sein Kennwort erneut einzugeben und dann ein neues Cookie erneut auszugeben.
Denken Sie daran, dass Ihr Benutzer möglicherweise mehr als einen Computer hat, sodass er möglicherweise mehr als eine aktive Sitzung hat. Tun Sie nichts, was sie zwingt, sich jedes Mal neu anzumelden, wenn sie zwischen Computern wechseln.
quelle
Haben Sie darüber nachgedacht, ein Buch über PHP-Sicherheit zu lesen? Sehr empfehlenswert.
Ich habe mit der folgenden Methode für nicht SSL-zertifizierte Sites viel Erfolg gehabt.
Deaktivieren Sie mehrere Sitzungen unter demselben Konto, und stellen Sie sicher, dass Sie dies nicht nur anhand der IP-Adresse überprüfen. Prüfen Sie lieber anhand eines Tokens, das bei der Anmeldung generiert wird und mit der Benutzersitzung in der Datenbank gespeichert ist, sowie anhand der IP-Adresse, HTTP_USER_AGENT usw.
Verwenden von relationsbasierten Hyperlinks Erzeugt einen Link (z. B. http://example.com/secure.php?token=2349df98sdf98a9asdf8fas98df8) ). Der Link wird mit einer zufällig gesalzenen x-BYTE-Zeichenfolge (bevorzugte Größe) angehängt Token entspricht einer angeforderten Seite.
Cookie für die Sitzungsauthentifizierung mit kurzer Lebensdauer. Wie oben angegeben, ist ein Cookie mit einer sicheren Zeichenfolge, die einen direkten Hinweis auf die Gültigkeit der Sitzung enthält, eine gute Idee. Lassen Sie es alle x Minuten ablaufen, stellen Sie dieses Token erneut aus und synchronisieren Sie die Sitzung erneut mit den neuen Daten. Wenn die Daten nicht übereinstimmen, melden Sie den Benutzer entweder ab oder lassen Sie ihn seine Sitzung erneut authentifizieren.
Ich bin kein Experte auf diesem Gebiet, ich habe ein bisschen Erfahrung in diesem speziellen Thema, hoffe, dass einiges davon irgendjemandem da draußen hilft.
quelle
Dies erfasst kontextbezogene Informationen über die Sitzung des Benutzers, Informationen, die sich während der Lebensdauer einer einzelnen Sitzung nicht ändern sollten. Ein Benutzer wird nicht gleichzeitig in den USA und in China an einem Computer sitzen, oder? Wenn sich die IP-Adresse innerhalb derselben Sitzung plötzlich ändert, was stark einen Sitzungsentführungsversuch impliziert, sichern Sie die Sitzung, indem Sie die Sitzung beenden und den Benutzer zur erneuten Authentifizierung zwingen. Dies vereitelt den Hack-Versuch, der Angreifer muss sich ebenfalls anmelden, anstatt Zugriff auf die Sitzung zu erhalten. Benachrichtigen Sie den Benutzer über den Versuch (Ajax es ein wenig), und vola, leicht genervter + informierter Benutzer und seine Sitzung / Informationen sind geschützt.
Wir setzen User Agent und X-FORWARDED-FOR ein, um unser Bestes zu geben, um die Eindeutigkeit einer Sitzung für Systeme hinter Proxys / Netzwerken zu erfassen. Möglicherweise können Sie mehr Informationen als diese verwenden. Sie können auch kreativ sein.
Es ist nicht 100%, aber es ist verdammt effektiv.
Sie können noch mehr tun, um Sitzungen zu schützen und sie ablaufen zu lassen, wenn ein Benutzer eine Website verlässt und zurückkommt und ihn möglicherweise zwingt, sich erneut anzumelden. Sie können einen Benutzer erkennen, der das Unternehmen verlässt und zurückkehrt, indem Sie einen leeren HTTP_REFERER erfassen (Domain wurde in die URL-Leiste eingegeben) oder prüfen, ob der Wert im HTTP_REFERER Ihrer Domain entspricht oder nicht (der Benutzer hat auf einen externen / gestalteten Link geklickt, um zu Ihrem zu gelangen Seite? ˅).
Sitzungen ablaufen lassen, nicht unbegrenzt gültig lassen.
Verlassen Sie sich nicht auf Cookies, sie können gestohlen werden. Dies ist einer der Angriffsmethoden für die Entführung von Sitzungen.
quelle
$_SESSION['ident'] = $aip . $bip . $agent;
wäre genauso sicher.Probieren Sie das in diesem Dokument von Liu, Kovacs, Huang und Gouda beschriebene Secure Cookie-Protokoll aus :
Wie im Dokument angegeben:
Zur Vereinfachung der Bereitstellung:
Kurzum: Es ist sicher, leicht, funktioniert bei mir einfach super.
quelle
Es gibt keine Möglichkeit, das Entführen von Sitzungen zu 100% zu verhindern, aber mit einem gewissen Ansatz können wir die Zeit reduzieren, die ein Angreifer benötigt, um die Sitzung zu entführen.
Methode zur Verhinderung von Sitzungsentführungen:
1 - Verwenden Sie immer eine Sitzung mit SSL-Zertifikat.
2 - Sitzungscookie nur senden, wenn httponly auf true gesetzt ist (verhindern Sie, dass Javascript auf das Sitzungscookie zugreift)
2 - Verwenden Sie die ID zur Sitzungsregenerierung beim An- und Abmelden (Hinweis: Verwenden Sie die Sitzungsregenerierung nicht bei jeder Anforderung, da Sie bei aufeinanderfolgenden Ajax-Anforderungen die Möglichkeit haben, mehrere Sitzungen zu erstellen.)
3 - Legen Sie ein Sitzungszeitlimit fest
4 - Speichern Sie den Browser-Benutzeragenten in einer $ _SESSION-Variablen und vergleichen Sie ihn bei jeder Anforderung mit $ _SERVER ['HTTP_USER_AGENT']
5 - Setzen Sie ein Token-Cookie und setzen Sie die Ablaufzeit dieses Cookies auf 0 (bis der Browser geschlossen wird). Generieren Sie den Cookie-Wert für jede Anforderung neu. (Bei Ajax-Anforderungen generieren Sie kein Token-Cookie.) EX:
Hinweis: Token-Cookie nicht mit Ajax-Anforderung neu generieren Hinweis: Der obige Code ist ein Beispiel. Hinweis: Wenn sich Benutzer abmelden, muss das Cookie-Token sowie die Sitzung zerstört werden
6 - Es ist kein guter Ansatz, die Benutzer-IP zu verwenden, um das Entführen von Sitzungen zu verhindern, da sich die IP-Adresse einiger Benutzer bei jeder Anforderung ändert. DAS BEEINFLUSST GÜLTIGE BENUTZER
7 - Ich persönlich speichere Sitzungsdaten in einer Datenbank. Es liegt an Ihnen, welche Methode Sie anwenden
Wenn Sie Fehler in meinem Ansatz finden, korrigieren Sie mich bitte. Wenn Sie mehr Möglichkeiten haben, um Sitzungshyjaking zu verhindern, sagen Sie es mir bitte.
quelle
Stellen Sie sicher, dass Sie keine inkrementierenden Ganzzahlen für Sitzungs-IDs verwenden. Es ist viel besser, eine GUID oder eine andere lange zufällig generierte Zeichenfolge zu verwenden.
quelle
Es gibt viele Möglichkeiten, einen Schutz gegen Sitzungsentführungen zu schaffen. Alle verringern jedoch entweder die Benutzerzufriedenheit oder sind nicht sicher.
IP- und / oder X-FORWARDED-FOR-Prüfungen. Diese funktionieren und sind ziemlich sicher ... aber stellen Sie sich den Schmerz der Benutzer vor. Sie kommen mit WLAN in ein Büro, erhalten eine neue IP-Adresse und verlieren die Sitzung. Ich muss mich erneut anmelden.
User Agent prüft. Wie oben ist die neue Version des Browsers nicht verfügbar und Sie verlieren eine Sitzung. Darüber hinaus sind diese wirklich einfach zu "hacken". Für Hacker ist es trivial, gefälschte UA-Strings zu senden.
localStorage-Token. Generieren Sie beim Anmelden ein Token, speichern Sie es im Browserspeicher und speichern Sie es in einem verschlüsselten Cookie (serverseitig verschlüsselt). Dies hat keine Nebenwirkungen für den Benutzer (localStorage bleibt durch Browser-Upgrades erhalten). Es ist nicht so sicher - es ist nur Sicherheit durch Dunkelheit. Zusätzlich können Sie JS eine Logik (Verschlüsselung / Entschlüsselung) hinzufügen, um sie weiter zu verschleiern.
Neuausgabe des Cookies. Dies ist wahrscheinlich der richtige Weg, dies zu tun. Der Trick besteht darin, jeweils nur einem Client die Verwendung eines Cookies zu erlauben. Ein aktiver Benutzer erhält also jede Stunde oder weniger ein neues Cookie. Altes Cookie wird ungültig, wenn ein neues Cookie ausgegeben wird. Hacks sind weiterhin möglich, aber viel schwieriger durchzuführen. Entweder Hacker oder gültige Benutzer erhalten einen abgelehnten Zugriff.
quelle
Nehmen wir an, dass sich Client und Server während der Anmeldephase auf einen geheimen Salt-Wert einigen können. Danach stellt der Server bei jeder Aktualisierung einen Zählwert bereit und erwartet, dass der Client mit dem Hash von (geheimes Salz + Zählung) antwortet. Der potenzielle Entführer hat keine Möglichkeit, diesen geheimen Salzwert zu erhalten, und kann daher den nächsten Hash nicht generieren.
quelle
AFAIK Auf das Sitzungsobjekt kann auf dem Client nicht zugegriffen werden, da es auf dem Webserver gespeichert ist. Die Sitzungs-ID wird jedoch als Cookie gespeichert und ermöglicht es dem Webserver, die Sitzung des Benutzers zu verfolgen.
Um zu verhindern, dass eine Sitzung über die Sitzungs-ID entführt wird, können Sie eine Hash-Zeichenfolge im Sitzungsobjekt speichern, die mithilfe einer Kombination aus zwei Attributen, Remote-Adresse und Remote-Port, erstellt wird, auf die auf dem Webserver im Anforderungsobjekt zugegriffen werden kann. Diese Attribute binden die Benutzersitzung an den Browser, in dem sich der Benutzer angemeldet hat.
Wenn sich der Benutzer über einen anderen Browser oder einen Inkognito-Modus auf demselben System anmeldet, bleibt die IP-Adresse dieselbe, der Port ist jedoch unterschiedlich. Wenn auf die Anwendung zugegriffen wird, wird dem Benutzer daher vom Webserver eine andere Sitzungs-ID zugewiesen.
Unten ist der Code aufgeführt, den ich implementiert und getestet habe, indem ich die Sitzungs-ID von einer Sitzung in eine andere kopiert habe. Es funktioniert ganz gut. Wenn es eine Lücke gibt, lassen Sie mich wissen, wie Sie sie simuliert haben.
Ich habe den SHA-2-Algorithmus verwendet, um den Wert anhand des Beispiels bei SHA-256 Hashing in Baeldung zu hashen
Ich freue mich auf Eure Kommentare.
quelle
Um das Risiko zu verringern, können Sie der Sitzung auch die ursprüngliche IP zuordnen. Auf diese Weise muss sich ein Angreifer im selben privaten Netzwerk befinden, um die Sitzung nutzen zu können.
Das Überprüfen von Referer-Headern kann ebenfalls eine Option sein, diese können jedoch leichter gefälscht werden.
quelle
Schützen durch:
quelle