Warum und wann sollte ich die session_regenerate_id()
Funktion in PHP verwenden? Sollte ich es immer benutzen, nachdem ich das benutzt habe session_start()
? Ich habe gelesen, dass ich es verwenden muss, um eine Sitzungsfixierung zu verhindern. Ist dies der einzige Grund?
php
session
session-fixation
rvandoni
quelle
quelle
Antworten:
Was ist
session_regenerate_id()
?Wie der Funktionsname sagt, ist es eine Funktion, die die aktuelle Sitzungs-ID durch eine neue ersetzt und die aktuellen Sitzungsinformationen beibehält.
Was tut es?
Es hilft hauptsächlich dabei, Angriffe zur Sitzungsfixierung zu verhindern. Bei Angriffen zur Sitzungsfixierung versucht ein böswilliger Benutzer, die Sicherheitsanfälligkeit in einem System auszunutzen, um die Sitzungs-ID (SID) eines anderen Benutzers zu korrigieren (festzulegen). Auf diese Weise erhalten sie als ursprünglicher Benutzer vollständigen Zugriff und können Aufgaben ausführen, für die ansonsten eine Authentifizierung erforderlich wäre.
Um solche Angriffe zu verhindern, weisen Sie dem Benutzer eine neue Sitzungs-ID zu,
session_regenerate_id()
wenn er sich erfolgreich anmeldet (oder für jede X-Anforderung). Jetzt hat nur er die Sitzungs-ID und Ihre alte (fixierte) Sitzungs-ID ist nicht mehr gültig.Wann soll ich verwenden
session_regenerate_id()
?Wie symbecean in den Kommentaren unten ausführt, muss die Sitzungs-ID bei jedem Übergang im Authentifizierungsstatus und nur bei Authentifizierungsübergängen geändert werden .
Weiterführende Literatur:
quelle
Sie sollten verwenden
session_regenerate_id()
, um die Sitzungsentführung und die Sitzungsfixierung zu stoppen .Aus dieser Security.SE-Antwort :
Von dieser Webseite :
Wann zu verwenden
Wenn der Benutzer einige wichtige Eingaben bearbeitet / aktualisiert (Ändern von Kennwörtern, Anmeldeinformationen, vergessenen Kennwörtern usw.), die die Sicherheit der Website oder die Datenschutzrichtlinien beeinträchtigen können.
Siehe auch:
PHP-Sicherheitshandbuch: Sitzungen
Sitzungsfixierung (gut gelesen)
quelle
Ich denke, das Problem der Sitzungsvergiftung wurde ziemlich gut behandelt.
Um die Frage "Wann soll ich das verwenden?" Teil ist es wichtig, einen Schritt zurückzutreten und zu überlegen, was Ihre Anwendung mit der Sitzung macht. Oder anders ausgedrückt: Dies ist die wichtigste Sicherheitsfrage, die Sie beantworten müssen
Wenn Sie nur ansonsten anonyme Daten verfolgen (der Benutzer kommt zur Website und Sie verwenden sie, um seine Besuche zu verfolgen), gibt es wenig Grund, eine Sitzung neu zu generieren. Ein Entführer würde durch diese Sitzung nichts Wertvolles gewinnen.
Viele Websites bieten jedoch Anmeldungen an. Ein Login ändert viele Dinge. Ich kann auf mein Profil zugreifen. Ich kann Einstellungen ändern. Ein Hijacker möchte möglicherweise meinen Kontozugriff, insbesondere wenn normale Benutzer und Administratoren alle Sitzungen zum Verwalten der Anmeldung verwenden. Wenn also Leute zu meiner Site kommen und sich anmelden, regeneriere ich die Sitzung neu. Es fügt eine zusätzliche Sicherheitsebene hinzu, dass mein neu angemeldeter Benutzer weniger wahrscheinlich entführt wird.
Jedes Mal, wenn wir einer Sitzung wichtige Daten hinzufügen, sollten Sie die Sitzungs-ID neu generieren. Wenn Sie Ihre Anwendung gegen Fixierung härten müssen, kann eine zufällige Regeneration nützlich sein, aber ich würde NIEMALS bei jeder Anfrage regenerieren. Standardmäßig speichert PHP Sitzungen in Dateien auf der lokalen Festplatte. Sie fügen eine Menge Festplatten-E / A hinzu, um einen relativ kleinen Angriffsvektor zu verringern. Wenn Sie wirklich mehr Sicherheit benötigen, würde ich empfehlen, regelmäßig HTTPS anstelle der regelmäßigen Regeneration zu verwenden (HTTPS macht es sehr schwierig, die Fixierung durchzuführen).
quelle
Warum sollte ich verwenden
session_regenerate_id
?Sie sollten es verwenden, um eine Sitzungsfixierung zu verhindern .
Wann soll ich verwenden
session_regenerate_id
?Wenn sich der Authentifizierungsstatus ändert, erfolgt dies hauptsächlich beim An- und Abmelden.
Beispiel
Bob sitzt an einem öffentlichen Computer und eröffnet dort durch Stöbern auf stackoverflow.com eine neue Sitzung. Die Sitzungs-ID wird in einem Cookie gespeichert (mit
httpOnly
Flag, um den Zugriff über Javascript zu verhindern). Stellen wir uns vor, bei Stack Overflow war HTTPS immer aktiviert und auch dassecure
Flag für das Cookie gesetzt.Wie können wir die Sitzung jetzt stehlen?
Bob schreibt die Sitzungs-ID auf. Er verlässt den Computer, ohne den Browser zu schließen. Jetzt kommt Alice zu diesem Computer und sieht, dass der Stapelüberlauf bereits geladen ist. Sie meldet sich jetzt an.
Jetzt sind wir in der Phase, in der Sie verwenden sollten
session_regenerate_id
. Wenn Sie hier während der Anmeldung keine neue Sitzungs-ID erstellen, kann Bob die zuvor notierte Sitzung verwenden, um auf die Sitzung von Alice zuzugreifen, und wird jetzt als Alice angemeldet.quelle
session_regenerate_id()
ausgestellt wurde, kann Alice auf das Bob-Konto zugreifen? ist das richtig?Sie können es für eine bessere Sicherheit verwenden.
Auf diese Weise erstellen Sie Sitzungs-IDs für die einmalige Verwendung.
Nehmen wir an, Ihre Benutzersitzungs-ID ist = 3
Einige Hacker haben Ihren Client gehackt und ihre session_id erhalten. Hacker können diesen Cookie also verwenden, um ihre Sitzung zu verwenden.
Wenn Sie Code wie haben
Sie können ihre Sitzung jedes Mal ändern, wenn sie Ihre Website nutzen.
Jetzt bekommt der Hacker sessionid = 3
Aber Sie haben die Sitzung geändert, nachdem er das verwendet hat
Benutzer haben sessionid = 4 // auth
Hacker haben Sitzung = 3 // null
Aber es gibt einen kleinen Punkt: Nehmen wir an, Sie verwenden die Regenerierungsmethode und Ihr Client meldet sich einfach auf der Website an und schließt den Browser oder ist inaktiv. Ihr Client hat sessionid = 4 und wenn Hacker an diesem Teil Cookies erhalten, haben sie dieselbe sessionid.
Wie oben erläutert, können Sie Ihren Client auf diese Weise vor Daten-Sniffing auf eine Weise schützen. Dieses Problem wird jedoch nicht endgültig behoben.
Aber es ist viel sicherer, wenn Sie SSL-Enc verwenden.
Entschuldige mein schlechtes Englisch.
quelle
Ein einfacher Anwendungsfall:
Eine Sitzung wird gestartet und ein Eintrag in die Datenbank vorgenommen. Der Shopcart des Benutzers wird durch seine Sitzungs-ID identifiziert.
Für jedes hinzugefügte Produkt wird eine Aufzeichnung in meiner Shopcart-Tabelle erstellt. Wird auch durch die Sitzungs-ID identifiziert.
Der Benutzer hat beschlossen, seinen Einkaufswagen zu speichern. Es wird jetzt an seine Benutzer-ID angehängt.
Die Sitzungs-ID wird neu generiert und der Benutzer kann nun mit der Erstellung eines weiteren Shopcarts beginnen.
quelle
quelle