Wann und warum sollte ich session_regenerate_id () verwenden?

95

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?

rvandoni
quelle
denn nach dem Sitzungsstart wird das erstellt und auf der anderen Seite, wenn Sie die Sitzung starten, sind die Variablen vorhanden: -
HaRsH
@ HaRsH Oo? Session_regenerate_id entfernt die alte Sitzungs-ID und erstellt eine neue, um zu vermeiden, dass die Sitzung beispielsweise mit XSS entführt wird. Dies hat keinen Einfluss auf die Sichtbarkeit von SESSION-Variablen in anderen Dokumenten.
Xatenev
Ja, ich weiß, dass ich keine Auswirkung auf andere Variablen habe, aber wenn Sie die Sitzung auf dieser Seite nicht starten, sind die Variablen auf dieser Seite in Core PHP nicht vorhanden
HaRsH
1
Aber hier geht es um session_regenerate_id, nicht um session_start ...
Xatenev
1
Ich würde vorschlagen, den RFC dort zu lesen, wo er vorgeschlagen wurde: wiki.php.net/rfc/precise_session_management
jankal

Antworten:

96

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:

Amal Murali
quelle
2
Und was hängt an, wenn der Hacker den 20. Anruf tätigt? Sitzungs-ID wurde geändert und er ist der einzige, der die Sitzung besitzt;))
fred727
@ fred727 Wenn der Hacker das Glück hat, den 20. Anruf zu tätigen, hat der Benutzer eine ungültige ID und wird nicht mehr authentifiziert. Ohne Regeneration würden sowohl Hacker als auch Benutzer authentifiziert.
Bradmage
Es kann auch nützlich sein, session_regenerate_id aufzurufen, wenn vertrauliche Informationen in den Sitzungen gespeichert werden (also nicht nur bei Authentifizierungstransitionen)
Adam
Ist es möglich, die Sitzung zu korrigieren, wenn die Sitzungsinformationen nicht in einem Cookie enthalten sind? Ich speichere die Sitzungsinformationen in Dateien auf meinem Server. Ist es erforderlich, die ID neu zu generieren?
Gonzalo
"Fixieren (Festlegen) der Sitzungs-ID (SID) eines anderen Benutzers" .... Dies sollte ersetzt werden durch "Fixieren (Festlegen) einer Sitzungs-ID (SID) auf dem Computer eines anderen Benutzers und Verwenden dieser nach der Authentifizierung "
Buchhalter م
24

Sie sollten verwenden session_regenerate_id(), um die Sitzungsentführung und die Sitzungsfixierung zu stoppen .

Aus dieser Security.SE-Antwort :

Sitzungsentführung bezieht sich auf das Stehlen des Sitzungscookies. Dies kann am einfachsten erreicht werden, wenn ein lokales Netzwerk mit anderen Computern geteilt wird. ZB bei Starbucks. Beispiel ... ein Benutzer mit Sitzung Y durchsucht James 'Website bei Starbucks. Ich lausche ihrem Netzwerkverkehr und nippe an meinem Latte. Ich nehme Benutzer mit den Cookies von Sitzung Y für James 'Website und stelle meinen Browser so ein, dass sie verwendet werden. Wenn ich jetzt auf James 'Site zugreife, auf James' Site.

Von dieser Webseite :

Die Sitzungsfixierung ist eine Angriffstechnik, bei der die Sitzungs-ID eines Benutzers auf einen expliziten Wert gesetzt wird. Abhängig von der Funktionalität der Zielwebsite kann eine Reihe von Techniken verwendet werden, um den Sitzungs-ID-Wert zu "korrigieren". Diese Techniken reichen von Cross-Site Scripting-Exploits bis hin zum Peppen der Website mit zuvor gestellten HTTP-Anforderungen. Nachdem die Sitzungs-ID eines Benutzers festgelegt wurde, wartet der Angreifer darauf, dass sich dieser Benutzer anmeldet. Sobald der Benutzer dies tut, verwendet der Angreifer den vordefinierten Sitzungs-ID-Wert, um dieselbe Online-Identität anzunehmen.

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)

Dimag Kharab
quelle
22

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 jemand diese Sitzung in die Hand nehmen würde, was würde er gewinnen?

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).

Machavity
quelle
2
HTTPS ändert an der Fixierung nichts.
Kelunik
4
Dies erschwert jedoch das Schnüffeln von Angriffen, mit denen die Sitzungs-ID überhaupt abgerufen werden kann.
Demonkoryu
Meine PHP-App meldet sich innerhalb von Sekunden ab. Ich verwende die Regeneration. Gibt es ein Limit für Sitzungsdateien, die erstellt werden können, oder gibt es ein Limit für regenerierte IDs, die das Abmelden verursachen könnten?
sqlchild
Nicht generell nein. Vielleicht möchten Sie eine separate Frage dazu stellen
Machavity
16

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 httpOnlyFlag, um den Zugriff über Javascript zu verhindern). Stellen wir uns vor, bei Stack Overflow war HTTPS immer aktiviert und auch das secureFlag 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.

Kelunik
quelle
Aber bis zu dem Zeitpunkt, an dem die session_regenerate_id()ausgestellt wurde, kann Alice auf das Bob-Konto zugreifen? ist das richtig?
Akam
2
@akam - Es ist spät, aber es lohnt sich zu antworten ... 1. Bob meldet sich nicht ab, Alice kann sich anmelden - 2. Bob meldet sich ab, Alice meldet sich nicht an, Alice kann seine Sitzungs-ID verwenden, aber Es gibt keine aktive Anmeldung, um auf seine Daten zuzugreifen - 3. Bob meldet sich ab, Alice meldet sich an, Bob verwendet die Sitzungs-ID, es gibt eine aktive Anmeldung, Bob greift auf Alices Daten zu. Um genau zu sein: Abhängig von der Sicherheit der Skripte bedeutet eine Sitzungs-ID nicht unbedingt, dass Sie auf die Daten eines abgemeldeten Benutzers zugreifen können, aber im Allgemeinen ist dies ein mögliches und hohes Risiko.
Codekandis
15

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

session_start();
session_regenerate_id();

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.

Hasan Veli Soyalan
quelle
12

Ein einfacher Anwendungsfall:

// User visits a webshop
$shopcart = new Cart();

Eine Sitzung wird gestartet und ein Eintrag in die Datenbank vorgenommen. Der Shopcart des Benutzers wird durch seine Sitzungs-ID identifiziert.

// User orders items
$shopcart->add('123', 20);
$shopcart->add('124', 18);
$shopcart->add('127', 5);

Für jedes hinzugefügte Produkt wird eine Aufzeichnung in meiner Shopcart-Tabelle erstellt. Wird auch durch die Sitzungs-ID identifiziert.

// User saves cart in order to use it later
$shopcart->save();

Der Benutzer hat beschlossen, seinen Einkaufswagen zu speichern. Es wird jetzt an seine Benutzer-ID angehängt.

// Regenerate session id for user to be able to make a new cart
session_regenerate_id();

Die Sitzungs-ID wird neu generiert und der Benutzer kann nun mit der Erstellung eines weiteren Shopcarts beginnen.

Peter
quelle
4

session_regenerate_id (): Sitzungs-ID kann nicht neu generiert werden - Sitzung ist nicht aktiv

if(session_status() == PHP_SESSION_ACTIVE)
{
    session_regenerate_id();
}
Anton
quelle