Hi,
ich habe mich heute erstmalig mit Sessions in PHP (Verwendete Version ist 5-53STABLE-STANDARD) beschäftigt. Ich möchte in diesem Post gerne abklären, ob ich da die Basics wirklich richtig verstanden habe - also kurz zusammenfassen, womit ich mich bisher beschäftigt habe und wie ich das bisher gelesene interpretiere. Ich hoffe, es findet sich jemand, der mich darauf aufmerksm macht, wenn ich etwas mißinterpretiere oder falsch verstehe. Im Anschluß habe ich dann auch noch Fragen zu diesem Thema.
Der Parameter 'session.auto_start' in meiner php.ini hat den Wert '0'. Hätte er den Wert '1', dann würde bei jedem Aufruf einer php-Ressource eine Session gestartet werden bzw. eine bestehende Session würde fortgesetzt werden. Da der Wert aber '0' ist, muß ich, wenn ich eine Session möchte, diese manuell starten und schreibe deshalb gleich zu Beginn als allererstes, also gleich nach dem einleitenden '<?php
' ein 'session_start();
' in die nächste Zeile. Habe ich das soweit richtig verstanden?
Durch mein 'session_start();
' wird also eine Session gestartet bzw. eine schon bestehende wieder aufgenommen. Session bedeutet, dass es ab diesem Zeitpunkt ein Array mit dem Namen '$_SESSION' gibt, in welches ich jetzt beliebig viele Variablen/Werte schreiben kann und andere Seiten, die dann mit dieser Session weiterarbeiten, auf diese Werte bzw. dieses Array zugreifen können. In dem Moment, wo eine Session gestartet wird, vergibt der Server auch ein Erkennungsmerkmal für diese Session, damit sie identifiziert werden kann. Dieses Erkennungsmerkmal ist die SID. Standartmäßig hat die SID den Namen 'PHPSESSID' und einen (durch Zufallsgenerator entstandenen?) eindeutigen Wert, der vom Server, auf dem PHP läuft, vergeben wird. Der Namen der SID wird ebenfalls durch die php.ini geregelt, nämlich durch den Parameter 'session.name'. Habe ich das soweit richtig verstanden?
In meiner php.ini haben die Parameter 'session.use_cookies' und 'session.use_only_cookies' beide den Wert '1'. Das bedeutet, dass der Wert meiner SID automatisch durch ein Cookie beim Client hinterlegt wird. Ruft nun der Client eine weitere php-Ressource ab, dann sendet er in der Anfrage dafür im Header automatisch den Wert der SID mit. Bildlich gesprochen: Er sagt dem Client: Nun parse mir bitte die Ressource 'foo.php' ... and by the way ... ich bin der Kunde mit der SID 'bar'. Somit erkennt mich der Server und schickt mir die Ressource 'foo.php' inclusive aller Werte/Variablen des dieser Session dazugehörenden Arrays '$_SESSION'. Habe ich das soweit richtig verstanden?
Da es sein kann, dass User in ihrem Browser Cookies deaktiviert haben, muß ich mich jetzt aber darum kümmern, dass sich auch diese User beim Aufruf der nächsten Ressource für eine Session identifizieren können - sprich, dass auch diese User die SID auf den Weg mitbekommen. Wenn ich also einen Link von der Session-startenden Seite zu einer nächsten schreibe, dann mache ich das so: <a href="nextpage.php?
<?php echo htmlspecialchars(SID); ?>
">weiter</a>
Dabei passiert Folgendes: Wenn der User Cookies akzeptiert, wird die Seite als 'nextpage.php?' aufgerufen und die SID im Header, also nicht sichtbar, mitgesendet. Wenn der Browser des Users Cookies nicht akzeptiert, wird die Seite als 'nextpage.php?PHPSESSID=7e7467a2d2...' aufgerufen. Die SID ist somit sichtbar. Das 'htmlspecialchars()
' ist eine Sicherheits-Absicherung gegen bösartige Angriffe. Der Grund, warum die URL im ersten Fall nicht mit der SID verlängert wird, ist der Wert '1' des Parameters ''session.use_only_cookies' in der php.ini. Habe ich das soweit richtig verstanden?
OK, hier nun meine Fragen. Ich freue mich über jede beantwortete.
1.) Habe ich das Session-Sytsem, zumindest mal den Anfang davon, grundlegend richtig verstanden? Gibt es irgendwelche weiteren Session-Parameter in der php.ini, auf die ich aus bestimmten Gründen achten muß?
2.) Was würde denn passieren, wenn in meiner php.ini der Parameter 'session.use_only_cookies' den Wert '0' hätte? Dann würde also die SID nicht nur über den Cookie und weiter dann im Header der nächsten Anfrage zum Client kommen, sondern auch ... wie??? Und wenn jetzt zusätzlich auch noch der Parameter 'session.use_cookies' den Wert '0' hätte, dann gäbe es also keinen gesetzten Cookie und das weitere Prozedere wäre ... was???
3.) Gegen welche Art von Angriff bzw. Mißbrauch schütze ich mich eigentlich durch die verwendung des 'htmlspecialchars()
' beim Anhängen der SID an eine URL?
4.) Bleiben wir bei meiner Konfiguration. Es wird nur mit Cookies gearbeitet - und nehmen wir weiters an, der Browser des Users läßt Cookies zu. Das bedeutet, um bei obigem Beispiel zu bleiben, dass die nächste Seite als 'nextpage.php?' aufgerufen wird. Mich nervt dieses nun sinnlose Fragezeichen am Ende der URL sehr. Muß ich damit leben oder kann ich den Code irgendwie so abändern, dass nur 'nextpage.php' aufgerufen wird, wenn Cookies akzeptiert werden und die SID somit im Header mitgesendet wird?
5.) Nicht verstanden habe ich das Beenden einer Session. Wenn ich noch vor dem 'session_start()
' ein 'session_set_cookie_params('3600');
' setze - was bedeutet das genau? Dass nach 1 Stunde alles weg ist, also die Variablen/Werte im Arry plus Name und wert der ID, so als ob es also nie eine Session gegeben hätte, oder ist das nur die Gültigkeitsdauer des Arrayinhalts? Die entsprechende Seite im Manual macht mich nicht ganz schlau. Genauso die Funktion session_destroy. Da steht im Manual:
session_destroy() löscht alle in Verbindung mit der aktuellen Session stehenden Daten. Mit der Session zusammenhängende globale Variablen und das Session-Cookie werden nicht gelöscht. Um wieder Session-Variablen verwenden zu können, muss session_start() aufgerufen werden. Um die Session komplett zu löschen, z.B. um einen Benutzer auszuloggen, muss auch die Session-ID gelöscht werden. Wenn zum Verfolgen der Session ein Cookie benutzt wird (standardmäßige Einstellung), muss das Session-Cookie gelöscht werden. Dafür kann setcookie() verwendet werden.
Das bringt mich nicht wirklich weiter. Was also sollte ich an der Stelle im Code, an dem alles (Session, Session Name, Session ID, Inhalt des Session-Arrays) gelöscht werden soll, schreiben? Und was genau bedeutet der Parameter 'session.cache_expire' in der php.ini, der bei mir standardmäßg den Wert '180' hat? Das hat doch auch was mit der Dauer der Gültigkeit zu tun, oder? Also die Beendigung und Dauer einer Session ... das habe ich noch nicht ganz verstanden.
6.) Bei oben beschriebenen Einstellungen - bin ich auf der sicheren Seite oder ist Arbeiten mit Sessions sehr gefährlich? Worauf muß ich noch achten? Gibt es Aspekte, die ich bis jetzt noch gar nicht erwähnt habe? Themen oder Internetseiten, mit denen ich mich noch beschäftigen soll?
Ich bedanke mich schon jetztbei allen Teilnehmern für ein interessantes Brainstorming zum Thema 'Sessions'. :-)
MfG
Hugo E.B.