Moin!
Irgendwo scheine ich einen Denkfehler zu haben...
Kann mir einer sagen wo?Ja, du solltest die Session nur weiterreichen, wenn keine Cookies zur Verfügung stehen - die Session-ID _immer_ weiterzureichen ist etwa antiquiert.
Heist das, dass bermerkt (wo?) wird, dass ich Cookies eingeschalten habe und deshalb SID leer ist?
Die Konstante SID wird von PHP dann befüllt, wenn KEIN Session-Cookie festgestellt wurde. Das ist logischerweise beim allerersten Request der Fall, denn erst durch das Ausführen von session_start() in der Serverantwort wird der erste Versuch unternommen, dem Browser ein Cookie zu geben. Der zuvor erfolgte Request des Browsers kann wegen des zeitlichen Ablaufs das Cookie noch nicht kennen.
Der Inhalt der Konstanten SID ist, in PHP-Code ausgedrückt, folgendes:
define('SID',session_name()."=".session_id());
Die Konstante ist direkt gebrauchsfertig, um sie an Links dranzuhängen - was man aber nur tun muss, wenn man explizit auch den Fall abdecken will, dass PHP dieses Anhängen nicht automatisch tut. Da PHP aber nur auf dem ausgegebenen HTML-Quelltext arbeitet, und beispielsweise nicht in Redirect-HTTP-Headern, gibt es trotz SID-Automatik in HTML-Links dennoch genug Anwendungsfälle für die Verwendung von SID.
Andererseits: Wenn man in seiner Anwendung die Übermittlung von Session-IDs auch ohne Cookies erlaubt, senkt man automatisch den Sicherheitslevel, denn dann ist der Anwender, der diesen Session-Mechanismus nutzt, angreifbar für Fixed-Session-ID-Attacken. Sprich: Wenn irgendein böser Mensch dem Anwender einen vorgefertigten Link inklusive Session-ID (im Link) schickt, der ihn dann zur Anmeldemaske führt, weiß der Angreifer, welche Session-ID verwendet wird, und kann die Session auf diese Weise dann übernehmen oder mitsurfen. Dagegen gibt es natürlich auch wieder Mittel, nämlich das Neugenerieren einer Session-ID bei Vorgängen, die beispielsweise den Zugriffslevel verändern. Ein Login ändert diesen Level beispielsweise, weil man hinterher mehr Informationen einsehen kann, als vorher.
- Sven Rautenberg