webentwicklung-frage-antwort-db.com.de

Wann und warum sollte ich session_regenerate_id () verwenden?

Warum und wann sollte ich die Funktion session_regenerate_id() in PHP verwenden? Soll ich es immer verwenden, nachdem ich die Funktion session_start() verwendet habe? Ich habe gelesen, dass ich es verwenden muss, um Sitzungsfixierungen zu verhindern. Ist dies der einzige Grund?

84
rvandoni

Was ist session_regenerate_id()?

Wie der Funktionsname sagt, handelt es sich um eine Funktion, die die aktuelle Sitzungs-ID durch eine neue ersetzt und die aktuellen Sitzungsinformationen beibehält.

Was tut es?

Es hilft hauptsächlich, Sitzungsfixierungsangriffe zu verhindern. Bei Sitzungsfixierungsangriffen versucht ein böswilliger Benutzer, die Sicherheitsanfälligkeit in einem System auszunutzen, um die Sitzungs-ID (SID) eines anderen Benutzers zu reparieren (festzulegen). Auf diese Weise erhalten sie vollständigen Zugriff als ursprünglicher Benutzer und können Aufgaben ausführen, für die andernfalls eine Authentifizierung erforderlich wäre.

Um solche Angriffe zu verhindern, weisen Sie dem Benutzer eine neue Sitzungs-ID zu, indem Sie session_regenerate_id() verwenden, 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 sollte ich session_regenerate_id() verwenden?

Wie in den Kommentaren unten angegeben, muss die Sitzungs-ID bei jedem Wechsel des Authentifizierungsstatus geändert werden und only bei Authentifizierungsübergängen.

Weitere Lektüre:

83
Amal Murali

Sie sollten session_regenerate_id() verwenden, um Session Hijacking und Session Fixation zu stoppen.

Von diese Security.SE-Antwort :

Sitzungsentführung bezieht sich auf das Stehlen des Sitzungscookies. Dies lässt sich am einfachsten erreichen, wenn Sie ein lokales Netzwerk für andere Computer freigeben. Z.B. bei Starbucks. Beispiel ... Ein Benutzer mit Sitzung Y durchsucht die Website von James bei Starbucks. Ich höre auf ihren Netzwerkverkehr und nippe an meinem Latte. Ich nehme Cookies von Benutzer mit Sitzung Y für James 'Website und stelle meinen Browser so ein, dass er sie verwendet. Wenn ich jetzt auf James 'Website zugreife, auf James' Website.

Von diese Webseite :

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

Wann verwenden

Wenn der Benutzer einige wichtige Eingaben bearbeitet/aktualisiert (Ändern von Kennwörtern, Anmeldeinformationen, vergessenen Kennwörtern usw.), kann dies die Sicherheit der Website oder die Datenschutzrichtlinien beeinträchtigen.

Siehe auch:

PHP-Sicherheitshandbuch: Sitzungen

Session Fixation (Nice read)

21
Dimag Kharab

Ich denke, das Thema Sitzungsvergiftung wurde ziemlich gut behandelt.

Um das "Wann soll ich das verwenden?" Teil ist es wichtig, einen Schritt zurück und überlegen, was Ihre Anwendung mit der Sitzung tut. Oder anders ausgedrückt: Dies ist die wichtigste Sicherheitsfrage, die Sie beantworten müssen

Wenn jemand diese Sitzung ergattern würde, was würde er gewinnen?

Wenn Sie nur anonyme Daten protokollieren (der Benutzer kommt auf die Website und Sie protokollieren damit seine Besuche), gibt es kaum einen Grund, eine Sitzung neu zu generieren. Ein Entführer würde nichts von Wert gewinnen, wenn er diese Sitzung ergreift.

Viele Websites bieten jedoch Anmeldungen an. Ein Login ändert vieles. Ich kann auf mein Profil zugreifen. Ich kann Einstellungen ändern. Daher möchte ein Hijacker möglicherweise meinen Kontozugriff, insbesondere wenn normale und Administratorbenutzer Sitzungen zum Verwalten der Anmeldung verwenden. Wenn also Leute zu meiner Site kommen und sich anmelden, generiere ich die Sitzung neu. Es fügt eine zusätzliche Sicherheitsebene hinzu, durch die mein neu angemeldeter Benutzer mit geringerer Wahrscheinlichkeit 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 NIE 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 minimieren. Wenn Sie wirklich mehr Sicherheit benötigen, würde ich das tun Befürworten Sie eine regelmäßige vollständige HTTPS-Regenerierung (HTTPS macht die Fixierung sehr schwierig).

17
Machavity

Warum sollte ich session_regenerate_id Verwenden?

Sie sollten es verwenden, um Sitzungsfixierung zu verhindern.

Wann sollte ich session_regenerate_id Verwenden?

Wann immer sich der Authentifizierungsstatus ändert, geschieht dies hauptsächlich beim Anmelden und Abmelden.

Beispiel

Bob sitzt an einem öffentlichen Computer und eröffnet dort durch Surfen auf stackoverflow.com eine neue Sitzung. Die Sitzungs-ID wird in einem Cookie gespeichert (mit dem Flag httpOnly, um den Zugriff über Javascript zu verhindern). Stellen wir uns vor, Stack Overflow hätte immer HTTPS aktiviert und auch das Flag secure 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 an der Stelle, an der Sie session_regenerate_id Verwenden sollten. 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 ist jetzt als Alice angemeldet.

12
kelunik

Ein einfacher Anwendungsfall:

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

Eine Sitzung wird gestartet und ein Eintrag in die Datenbank vorgenommen. Der Warenkorb 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 ein Datensatz in meiner Warenkorb-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 Warenkorb 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 einen neuen Warenkorb erstellen.

11
Peter

Sie können es für eine bessere Sicherheit verwenden.

Auf diese Weise erstellen Sie Sitzungs-IDs zur einmaligen Verwendung.

Nehmen wir an, Ihre Benutzersitzungs-ID ist = 3

Einige Hacker haben Ihren Client gehackt und dessen session_id erhalten. Hacker können dieses Cookie also verwenden, um ihre Sitzung zu verwenden.

Wenn Sie Code wie haben

session_start();
session_regenerate_id();

sie können die Sitzung jedes Mal ändern, wenn sie Ihre Website verwenden.

Jetzt bekommt der Hacker sessionid = 3

aber Sie haben die Sitzung geändert, nachdem er sie verwendet hat

benutzer haben sessionid = 4 // auth

hacker haben Sitzung = 3 // null

Angenommen, Sie verwenden die Regenerierungsmethode und Ihr Client meldet sich einfach bei der Website an und schließt den Browser oder ist inaktiv. Ihr Client hat sessionid = 4 und wenn Hacker an dieser Stelle Cookies erhalten, haben sie dieselbe sessionid.

Wie oben erläutert, können Sie Ihren Client auf diese Weise vor Datenschnüffeln auf eine Weise schützen, aber das Problem wird dadurch nicht endgültig behoben.

Aber es ist viel sicherer, wenn Sie SSL-Verschlüsselung verwenden.

Entschuldige mein schlechtes Englisch.

11

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

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