Wie einzigartig ist die PHP Session ID?

Wie einzigartig ist die PHP Session ID? Ich habe den Eindruck von verschiedenen Dingen, die ich gelesen habe, dass ich nicht darauf angewiesen sein sollte, dass zwei Benutzer niemals die gleiche SessionID erhalten. Ist es nicht eine GUID?

Session_id kann zwar dupliziert werden, aber die Wahrscheinlichkeit ist sehr gering. Wenn Sie eine Website mit einem fairen Datenverkehr haben, kann es passieren, einmal in Ihrem Leben auf der Website, und ärgert nur einen Benutzer für eine Sitzung.

Dies ist nicht wichtig, es sei denn, Sie erwarten eine Website mit hohem Trafficaufkommen oder einen Service für die Bankbranche.

Es ist nicht sehr einzigartig wie geliefert. In der Standardkonfiguration ist es das Ergebnis eines Hashes verschiedener Dinge einschließlich des Ergebnisses von gettimeofday (was nicht sonderlich einzigartig ist), aber wenn du dir Sorgen machst, solltest du es so konfigurieren, dass es etwas Entropie aus / dev / urandom zeichnet

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

Suche nach “php_session_create_id” im Code für den tatsächlichen Algorithmus, den sie verwenden.

Bearbeitet, um hinzuzufügen: Es gibt einen DFA-Zufallszahlengenerator, der von der PID gesetzt wird, gemischt mit der Zeit in Usec. Es ist keine feste Eindeutigkeitsbedingung, insbesondere aus einer Sicherheitsperspektive . Benutze die obige Entropie-Konfiguration.

Aktualisieren:

Ab PHP 5.4.0 ist session.entropy_file standardmäßig auf / dev / urandom oder / dev / arandom gesetzt, wenn es verfügbar ist. In PHP 5.3.0 ist diese Direktive standardmäßig leer. PHP Handbuch

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

Weitere Informationen zu PHP-Sitzungen finden Sie in diesem ausgezeichneten Artikel http://shiflett.org/articles/the-truth-about-sessions, der auch Links zu anderen Artikeln über Session Fixation und Hijack enthält.

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

  1. IP-Adresse des Clients
  2. Aktuelle Uhrzeit
  3. PHP Linear Congruence Generator – ein Pseudozufallszahlengenerator (PRNG)
  4. Betriebssystemspezifische Zufallsquelle – wenn das Betriebssystem über eine Zufallsquelle verfügt (z. B. / dev / urandom)

Wenn das Betriebssystem eine zufällige Quelle verfügbar hat, dann ist die Stärke der erzeugten ID für den Zweck einer Sitzungs-ID hoch ( / dev / urandom und andere Zufallsquellen des Betriebssystems sind (gewöhnlich) kryptographisch sichere PRNGs ). Wenn dies jedoch nicht der Fall ist, ist es zufriedenstellend.

Das Ziel bei der Generierung der Sitzungsidentifikation ist:

  1. Minimiere die Wahrscheinlichkeit, zwei Session-IDs mit demselben Wert zu generieren
  2. mach es sehr schwierig, rechnerisch zufällige Schlüssel zu erzeugen und einen gebrauchten zu treffen .

Dies wird durch den Ansatz von PHP zur Sitzungsgenerierung erreicht.

Sie können die Eindeutigkeit nicht absolut garantieren , aber die Wahrscheinlichkeiten sind so niedrig, dass sie den gleichen Hash zweimal erreichen, um den es sich im Allgemeinen nicht zu kümmern lohnt.

Größe der Sitzungs-ID
Angenommen, die seeion_id ist gleichmäßig verteilt und hat eine Größe von 128 Bits. Angenommen, jede Person auf dem Planeten meldet sich einmal täglich mit einer neuen Sitzung seit 1000 Jahren 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 

So ist die Wahrscheinlichkeit einer oder mehrerer Kollisionen weniger als eins in siebzigtausend 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, dass die neue session_id noch nicht existiert.

Zufälligkeit
Daher ist die große Frage, die ich denke, ob die Session_id: s mit guter Pseudozufälligkeit generiert werden. Da kann man nie sicher sein, aber ich würde zu diesem Zweck eine bekannte und häufig verwendete Standardlösung empfehlen (wie Sie es wahrscheinlich schon tun).

Selbst wenn Kollisionen aufgrund von Überprüfung vermieden werden, ist die Zufälligkeit und Größe von session_id wichtig, so dass Hacker nicht mit qualifizierter Wahrscheinlichkeit qualifiziertes Raten erzwingen und aktive session_id: s mit großer Wahrscheinlichkeit finden können.

Ich habe keine Bestätigung gefunden, aber ich glaube, PHP überprüft, ob eine Session-ID bereits existiert, bevor man eine mit dieser ID erstellt.

Das Problem der Sitzungsentführung, um das sich die Leute sorgen, ist, wenn jemand die Sitzungs-ID eines aktiven Benutzers findet. Dies kann in vielerlei Hinsicht verhindert werden, für weitere Informationen zu diesem Thema können Sie diese Seite auf php.net und dieses Papier zur Sitzungsfixierung sehen

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

 < ?php session_start(); $_SESSION['username']="username"; ?> < !DOCTYPE html>   Update    < ?php $conn=mysqli_connect("localhost","root","","telephasic"); $q2="select * from register where username = '".$_SESSION['username']."'"; $run=mysqli_query($conn, $q2); while($row=mysqli_fetch_array($run)) { $name=$row[1]; $email=$row[2]; ?>  < ?php } ?> 
Username Email Edit
< ?php echo $name; ?> < ?php echo $email; ?> Edit

Wenn Ihr Benutzername unterschiedlich oder eindeutig ist, können Sie diesen Code für die Sitzung verwenden