Tach!
bitte entschuldigt, dass ich einen neuen Beitrag eröffnet habe, aber ich habe dies deshalb getan, weil mein ursprüngliches Problem gelöst wurde, nun aber ein neues Problem aufgetreten ist, das mit vorgenanntem Beitrag in Zusammenhang steht.
Gerade weil es im Zusammenhang steht, wäre es sinnvoll, dort weiterzumachen. Dann wäre nämlich auch meine Antwort über die Sinnfälligkeit deines Vorhabens mit dabei.
Meine Überlegung hierbei war, dass an keiner Stelle ein konkretes Auslesen der ID über eine Zuordnung nach dem Muster
$ID = $_SESSION['ID']
möglich sein soll, um ein Ausspionieren der ID (weitestgehend) zu unterbinden.
In $_SESSION befinden sich immer nur die Daten des einen Clients, der sich durch seine Session-ID zu erkennen gegeben hat. reset($_SESSION) liefert mir das erste Element eines Arrays, auch ohne dass ich dessen Key kenne. Den gäbe es aber auch mit key(). Und über foreach, sowie array_keys(), was du schon gefunden hast. array_values() als Alternative zu reset() gäbe es auch noch.
Du siehst, es gibt viele Möglichkeiten, wenn ich erst einmal im Kontext des Anwenders bin, seine Daten abzugreifen. Hier noch was verschleiern zu wollen, ist aussichtslos.
Und dann ist die Sesssion-ID "lebenswichtig", um einen Client wiederzuerkennen. Der muss die ID gesagt bekommen und sie bei jedem Request wieder mitsenden. Der Server allein hat ohne die vom Client gesendete ID keine Chance, irgendeine Zuordnung zu früheren Requests herzustellen.
Was du verhindern kannst, wäre eine Wiederverwendung der ID mit session_regenerate_id(). Dann gilt ab dem nächsten Request die neue ID, die per neuem Cookie (oder URL-Parameter) mitgeteilt wird. Dieses Vorgehen bei jedem Request bringt aber den Nachteil mit sich, dass der Client beim Zurücklaufen zumindest bei per URL übertragener Session-ID nicht wiedererkannt wird, weil die vom Browser gemerkte URL mit ID nicht mehr gültig ist.
Ich lösche auf unserer Startseite (Code nachfolgend zusammengekürzt) zunächst alle Cookies und zerstöre etwaige Session-Daten (hoffentlich) komplett, erzeuge dann die ID und initialisiere die Session:
Den Cookie zu löschen ist nicht weiter nützlich. Wichtiger ist, $_SESSION zu leeren, wenn die Session definiert zu Ende gebracht wurde. Dass der Client allerdings mittendrin aufhört, weitere Requests zu senden und damit eine angefangene Session eine Mindestzeitdauer und ab da bis zur nächsten Garbage Collection herumliegt, ist unvermeidbarer Teil des Session-Konzepts. Besser geht es mit dem zustandslosen HTTP nicht.
session_start();
if (ini_get ("session.use_cookies"))
{
$params = session_get_cookie_params();
setcookie (session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"]);
}session_destroy();
session_start();
Du löschst also alle Cookies und "destroys all of the data associated with the current session" - was auch immer das konkret heißen mag, denn das wichtigste sind die Daten in $_SESSION, die leben bleiben.
$chars = md5 (uniqid (mt_rand(), true));
[...]
$_SESSION[$ID] = md5 (uniqid ($ID, true));
Eigentlich willst du den Hash $ID zuweisen, nehme ich an. Beim Berechnen ist jedenfalls ein Stück Zufall drin. Diese ID übergibst du aber nicht dem Client. Sie steht lediglich irgendwo in $_SESSION drin. Über das zweite session_start() wird einen neue Session-ID erzeugt und diese mittelbar (über Cookie in den Response-Headern) dem Client mitgeteilt.
Nach Anklicken unseres Logos wird auf unsere eigentliche Homepage weitergeleitet und die Session-Verwaltung über session_start(); erneut aufgerufen.
Mein Problem ist nun aber, wie ich auf die mir unbekannte ID zugreifen kann, um ihr übergebene Artikel unterordnen zu können.
Wenn sich die ID keiner merkt, kannst du darüber auch nicht mehr über die Daten zugreifen - abgesehen von den oben genannten einfachen Möglichkeiten, auch ohne sie auf die Daten zuzugreifen.
if (isset ($_SESSION[$ID]))
Neuer Request, der Variablenspeicher ist wieder jungfräulich. Nur in $_SESSION stehen "alte" Werte, wenn session_start() eine bekannte Session-ID finden konnte. Damit ist auch $ID nicht mehr vorhanden.
Ein Zugriff über
$_SESSION[$ID]
liefert mir die Fehlermeldung "Undefined variable: ID", was auch nachvollziehbar ist, da ich keine Variable namens $ID übergeben habe.
Schreibe ich anstelle von $ID überall 'ID', dann geht die Prüfung ohne Fehlermeldung in den else-Zweig und gibt mir "SESSION wurde nicht übergeben" aus.
Der String ID ist ja auch ein immer gleicher Wert. Und diesen String hast du bisher nirgends verwendet. Nun willst du ihn als Key nehmen? Du hast noch grundlegende Verständnisprobleme, wie Variablen und Literale so richtig zusammenspielen und willst ein sicherheitstechnisches Problem lösen. Das kann nicht wirklich gut enden.
Wie kann ich nun aber auf diese ID zugreifen, ohne sie explizit auslesen zu müssen?
Hellsehen geht nicht. Da sie zufällig ist, muss sie sich jemand merken - abgesehen von siehe oben.
Ich will, wie ich eingangs geschrieben habe, keine direkte Zuordnung im Code, dann könnte ich (und auch andere) sie direkt auslesen und ich sie verarbeiten (und möglicherweise andere missbrauchen).
Wie schon im anderen Posting gesagt, jemand der Code unter deinem Nutzer ausführen kann, kann problemlos sämtliche deiner Session-Dateien auslesen, ohne irgendwelche Session-IDs kennen zu müssen. Ein glob() oder opendir()/readdir() reicht da schon.
dedlfix.