Frage zu Sessions
DieKerstin
- php
0 suit
Hallo,
ich möchte, dass man sich auf einer Seite aus registreirter User anmelden kann.
Dazu spiele ich etwas mit den Session Funktionen von PHP rum.
Wenn ich nur:
<?php session_start(); ?>
<?=SID?>
in eine PHP Datei schreibe, wird mir beim ersten Aufruf dieser Datei im Browser eine SID angezeigt. Bei einem Reload jedoch nicht mehr.
Ich wollte mir eigentlich mit session_start();
eine SID generieren lassen und diese dann mit <?=SID?> in jeden Link/Formurar einbauen und somit die Sessio "weiterreichen".
Irgendwo scheine ich einen Denkfehler zu haben...
Kann mir einer sagen wo?
Liebe Grüße
Kerstin
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.
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?
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
Nun habe ich mal folgendes probiert:
<?PHP
if ( session_start () )
{
echo 'Session wurde erstellt!';
echo '<br /><a href="sessionTest.php?' . SID . '">weiter</a><br>';
echo session_id();
echo "<br>";
echo session_destroy();
}
?>
Die SID wird jetzt angezeigt :-).
Mit session_destroy();
sollte aber diese Session wieder zerstört werden. Da "1" in der letzte Zeile ausgegeben wird, denke ich, dass sie auch wirklich zerstört wird.
Wenn ich nun reload mache, wird wieder DIESELBE SID angezeigt. Wenn aber die Session zerstört wurde müßte doch beim Relaod eine neue mit einer neuen SID erzeugt werden. Oder?
LG Kerstin
Hi!
Die SID wird jetzt angezeigt :-).
Kümmere dich um die SID nur, wenn du dazu eine zwingende Notwendigkeit sieht. Beispielsweise, wenn die PHP-Konfiguration nicht vorsieht, die SID über die URL zu übertragen, wenn keine Cookies dafür verwendbar sind, du aber auch ohne Cookies die Nutzung von Sessions ermöglichen willst, und die PHP-Konfiguration nicht ändern kannst. Bei dir scheint die Übergabe per URL jedoch eingschaltet zu sein, obwohl es nicht mehr die aktuelle Default-Einstellung ist. Denn diese wäre, dass ausschließlich Cookies als SID-Transport genommen werden. Das ist auch besser so, denn eine Session-ID in der URL ermöglicht leichter, sie zu kapern.
Mit session_destroy() sollte aber diese Session wieder zerstört werden. Da "1" in der letzte Zeile ausgegeben wird, denke ich, dass sie auch wirklich zerstört wird.
Lies bitte im Handbuch zu dieser Funktion nach, was von der Session zerstört wird und was nicht.
Wenn ich nun reload mache, wird wieder DIESELBE SID angezeigt. Wenn aber die Session zerstört wurde müßte doch beim Relaod eine neue mit einer neuen SID erzeugt werden. Oder?
Die SID bleibt leben, wenn du erneut mit dieser ankommst, wird eine neue Session mit ebendieser SID erstellt.
Lo!
Moin!
Mit
session_destroy();
sollte aber diese Session wieder zerstört werden. Da "1" in der letzte Zeile ausgegeben wird, denke ich, dass sie auch wirklich zerstört wird.
session_destroy() löscht das Session-Cookie nicht. Folglich wird die Session-ID auch bei weiteren Requests immer brav mitgeschickt, und PHP nutzt dieselbe SID weiter.
Ich persönlich würde session_destroy() nicht benutzen. Gute Alternativen sind, explizit die Daten der Session zu löschen (alles im Array $_SESSION, z.B. durch $_SESSION = array();
), und/oder indem man den Status "nicht (mehr) eingeloggt" explizit als Status in den Sessiondaten festhält. Nach einer gewissen Zeit der Nichtbenutzung werden die Sessiondaten dann von der Garbage Collection entfernt.
- Sven Rautenberg