Wie eindeutig ist die PHP-Sitzungs-ID? Ich hatte den Eindruck, dass ich mich nicht darauf verlassen sollte, dass zwei Benutzer nie dieselbe Sitzungs-ID erhalten. Ist es nicht eine GUID?
90
Session_id kann zwar dupliziert werden, aber die Wahrscheinlichkeit ist sehr gering. Wenn Sie eine Website mit einem fairen Datenverkehr haben, kann dies einmal in Ihrem Website-Leben vorkommen und nur einen Benutzer für eine Sitzung ärgern.
Es lohnt sich nicht, sich darum zu kümmern, es sei denn, Sie erwarten, dass Sie eine Website mit sehr hohem Datenaufkommen oder einen Service für die Bankbranche erstellen.
Es ist nicht sehr einzigartig wie ausgeliefert. In der Standardkonfiguration ist dies das Ergebnis eines Hash verschiedener Dinge, einschließlich des Ergebnisses von gettimeofday (was nicht besonders eindeutig ist). Wenn Sie sich jedoch Sorgen machen, sollten Sie es so konfigurieren, dass eine Entropie aus / dev / urandom gezogen wird
Suchen Sie im Code nach "php_session_create_id" für den tatsächlich verwendeten Algorithmus.
Bearbeitet, um hinzuzufügen: Es gibt einen DFA-Zufallszahlengenerator, der von der PID ausgesät wird und mit der Zeit in usecs gemischt wird. Es ist keine feste Eindeutigkeitsbedingung, insbesondere aus Sicherheitsgründen . Verwenden Sie die obige Entropiekonfiguration.
Aktualisieren:
quelle
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 Code-Snippets):
Wenn dem Betriebssystem eine zufällige Quelle zur Verfügung steht, ist die Stärke der generierten ID zum Zweck der Sitzungs-ID hoch ( / dev / urandom und andere zufällige Quellen des Betriebssystems sind (normalerweise) kryptografisch sichere PRNGs ). Wenn dies jedoch nicht der Fall ist, ist es zufriedenstellend.
Das Ziel bei der Generierung der Sitzungsidentifikation ist:
Dies wird durch den PHP-Ansatz zur Sitzungsgenerierung erreicht.
Sie können die Eindeutigkeit nicht absolut garantieren , aber die Wahrscheinlichkeiten, denselben Hash zweimal zu treffen, sind so gering, dass es sich im Allgemeinen nicht lohnt, sich Sorgen zu machen.
quelle
Sie können eine alternative Hash-Generierungsfunktion installieren, wenn Sie die Art und Weise anpassen möchten, in der die ID generiert wird (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 hervorragenden Artikel unter http://shiflett.org/articles/the-truth-about-sessions, der auch auf andere Artikel zu Sitzungsfixierung und -entführung verweist.
quelle
Größe von session_id
Angenommen, seeion_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 dauerhaften neuen Sitzung für 1000 Jahre an.
Die Wahrscheinlichkeit einer oder mehrerer Kollisionen liegt also unter einer von 70.000 Milliarden. Daher sollte die 128-Bit-Größe der session_id groß genug sein. Wie in anderen Kommentaren erwähnt, überprüft der session_manager möglicherweise auch, ob die neue session_id noch nicht vorhanden ist.
Zufälligkeit
Daher ist die große Frage, die ich denke, ob die session_id: s mit guter Pseudozufälligkeit generiert werden. In diesem Punkt können Sie 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).
Selbst wenn Kollisionen aufgrund von Überprüfungen vermieden werden, ist die Zufälligkeit und Größe von session_id wichtig, damit Hacker nicht mit großer Wahrscheinlichkeit qualifiziert raten und aktive session_id: s finden können.
quelle
Ich habe keine Bestätigung dazu gefunden, aber ich glaube, PHP prüft, ob bereits eine Sitzungs-ID vorhanden ist, bevor eine mit dieser ID erstellt wird.
Das Problem der Sitzungsentführung ist, wenn jemand die Sitzungs-ID eines aktiven Benutzers herausfindet. Dies kann auf viele Arten verhindert werden. Weitere Informationen dazu finden Sie auf dieser Seite auf php.net und in diesem Dokument zur Sitzungsfixierung
quelle
Nein, die Sitzungs-ID ist keine GUID, aber zwei Benutzer sollten nicht dieselbe Sitzungs-ID erhalten, wie sie auf der Serverseite gespeichert sind.
quelle
Wenn Ihr Benutzername anders oder eindeutig ist, können Sie diesen Code für die Sitzung verwenden
quelle