it-swarm.com.de

Wie eindeutig ist die PHP Session ID?

Wie eindeutig ist die PHP Session ID? Ich habe den Eindruck von verschiedenen Dingen, die ich gelesen habe, dass ich mich nicht darauf verlassen sollte, dass zwei Benutzer niemals die gleiche Sitzungs-ID erhalten. Ist es nicht eine GUID?

89
Jalov

Session_id kann zwar dupliziert werden, aber die Wahrscheinlichkeit ist sehr gering. Wenn Sie eine Website mit fairem Datenverkehr haben, kann dies einmal im Leben Ihrer Website vorkommen und nur einen Benutzer für eine Sitzung nerven.

Es lohnt sich nicht, sich darum zu kümmern, es sei denn, Sie erwarten, eine Website mit sehr hohem Datenaufkommen oder einen Service für die Bankbranche zu erstellen.

37
e-satis

Es ist nicht sehr einzigartig wie ausgeliefert. In der Standardkonfiguration ist es das Ergebnis eines Hashs verschiedener Dinge, einschließlich des Ergebnisses von gettimeofday (was nicht besonders eindeutig ist), aber wenn Sie sich Sorgen machen, sollten Sie es so konfigurieren, dass es Entropie aus/dev/urandom zeichnet, wie dies der Fall ist

ini_set("session.entropy_file", "/dev/urandom");
ini_set("session.entropy_length", "512");

suchen Sie nach "php_session_create_id" in dem Code für den tatsächlichen Algorithmus, den sie verwenden.

Bearbeitet, um hinzuzufügen: Es gibt einen DFA-Zufallszahlengenerator, der durch die PID geimpft wird, gemischt mit der Zeit in usecs. Dies ist keine eindeutige Bedingung insbesondere unter Sicherheitsgesichtspunkten . Verwenden Sie die obige Entropiekonfiguration.

Update:

Ab PHP 5.4.0 session.entropy_file ist standardmäßig/dev/urandom oder/dev/arandom, falls verfügbar. In PHP= 5.3.0 dieser Anweisung ist standardmäßig leer. PHP Manual

66
djsadinoff

Wenn Sie wissen möchten, wie PHP standardmäßig eine Sitzungs-ID generiert, lesen Sie den Quellcode auf Github . Es ist sicherlich nicht zufällig und basiert auf einem Hash (Standard) : md5) dieser Zutaten (siehe Zeile 310 des Codeausschnitts):

  1. IP-Adresse des Clients
  2. Aktuelle Zeit
  3. PHP Linear Congruence Generator - ein Pseudozufallszahlengenerator (PRNG)
  4. Betriebssystemspezifische Zufallsquelle - Wenn für das Betriebssystem eine Zufallsquelle verfügbar ist (z. B./dev/urandom)

Wenn das Betriebssystem über eine zufällige Quelle verfügt, ist die Stärke der generierten ID für den Zweck, eine Sitzungs-ID zu sein, hoch (/dev/urandom und andere zufällige Betriebssystemquellen sind (normalerweise) kryptografisch sichere PRNGs ). Wenn dies jedoch nicht der Fall ist, ist es zufriedenstellend.

Das Ziel bei der Generierung der Sitzungsidentifikation ist:

  1. Minimieren Sie die Wahrscheinlichkeit, zwei Sitzungs-IDs mit demselben Wert zu generieren
  2. es sehr schwierig machen, zufällige Schlüssel zu generieren und einen in Gebrauch befindlichen zu treffen.

Dies wird durch den Ansatz von PHP zur Sitzungsgenerierung erreicht.

Sie können die Eindeutigkeit nicht absolut garantieren , aber die Wahrscheinlichkeit, dass ein Hash zweimal getroffen wird, ist so gering, dass es sich im Allgemeinen nicht lohnt, sich Sorgen zu machen.

12
GordyD

Sie können eine alternative Hash-Generierungsfunktion installieren, wenn Sie die Art der ID-Generierung anpassen möchten (standardmäßig wird eine 128-Bit-Nummer über MD5 generiert). Siehe http://www.php.net/manual/en/session.configuration.php#ini.session.hash-function

Weitere Informationen zu PHP Sitzungen finden Sie in diesem hervorragenden Artikel http://shiflett.org/articles/the-truth-about-sessions , der auch auf andere Artikel verweist über Session Fixation und Hijack.

11
Paul Dixon

Größe von session_id
Angenommen, seesion_id ist gleichmäßig verteilt und hat eine Größe von 128 Bit. Angenommen, jede Person auf dem Planeten meldet sich einmal am Tag mit einer andauernden neuen Sitzung für 1000 Jahre an.

num_sesion_ids  = 1000*365.25 *7*10**9 < 2**36
collission_prob < 1 - (1-1/2**82)**(2**36)  ≈ 1 - e**-(1/2**46) 
                ≈ 1/2**46 

Die Wahrscheinlichkeit einer oder mehrerer Kollisionen ist also geringer als eine von 70.000 Milliarden. Daher sollte die 128-Bit-Größe der session_id groß genug sein. Wie in anderen Kommentaren erwähnt, prüft der session_manager möglicherweise auch, ob die neue session_id noch nicht vorhanden ist.

Zufälligkeit
Daher ist die große Frage meiner Meinung nach, ob die session_id: s mit guter Pseudozufälligkeit generiert werden. Man kann sich nie sicher sein, aber ich würde empfehlen, eine bekannte und häufig verwendete Standardlösung für diesen Zweck zu verwenden (wie Sie es wahrscheinlich bereits tun).

Auch wenn Kollisionen aufgrund von Überprüfungen vermieden werden, ist die Zufälligkeit und Größe von session_id wichtig, damit Hacker nicht mit hoher Wahrscheinlichkeit qualifiziert raten und aktive session_id: s finden können.

5
MrJ

Ich habe keine Bestätigung dafür gefunden, aber ich glaube, PHP prüft, ob eine Sitzungs-ID bereits vorhanden ist, bevor es eine mit dieser ID erstellt.

Das Problem der Sitzungsentführung, über das sich die Leute Sorgen machen, ist, wenn jemand die Sitzungs-ID eines aktiven Benutzers herausfindet. Dies kann auf viele Arten verhindert werden. Weitere Informationen finden Sie unter diese Seite auf php.net und dieses Dokument zur Sitzungsfixierung

3
Ólafur Waage

Nein, die Sitzungs-ID ist keine GUID, aber zwei Benutzer sollten nicht dieselbe Sitzungs-ID erhalten, wie sie auf der Serverseite gespeichert sind.

2
gizmo