Hi!
[...] 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?
Jein. Es darf lediglich vor dem session_start() keine andere Ausgabe außer HTTP-Headern (Funktion header()) erfolgt sein. Wenn du zum Beispiel nach dem EVA-Prinzip strukturierst, hast du ja erst ganz zum Schluss irgendwelche Nutzdatenausgaben, und bis dahin kannst du beliebig Header generieren, auch den Cookie-Header von session_start().
[$_SESSION und SID] Habe ich das soweit richtig verstanden?
Ja. Das wichtigste ist $_SESSION. Die SID ist nett zu wissen, ist aber nicht unbedingt kriegsentscheidend. Das PHPSESSID wirst du als Keksname oder bei angehängtem URL-Parameter wiederfinden.
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.
Und nur durch einen Cookie, keinen angehängten URL-Parameter.
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?
Jein. Aus Sicht des Browsers existiert nur ein Cookie für die Domain (und Path, wenn du den Default-Wert '/' änderst), das er mitsendet. Dass das eine SID und dahinter eine Wiedererkennung seinerseits stattfindet, ist ihm egal.
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.
Das kann PHP auch selbst erledigen. Da URL-Parameter aber einfacher in fremde Hände gelangen können, hat man diesen Weg mittlerweile nicht mehr per default eingeschaltet. Relevant dafür sind session.use_only_cookies und session.use_trans_sid.
Wenn ich also einen Link von der Session-startenden Seite zu einer nächsten schreibe, dann mache ich das so: [...] 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 geschieht nicht automatisch, wenn du das zu Fuß machen willst. In dem Fall musst du auch prüfen, ob ein Session-Cookie vorhanden ist und dementsprechend die URL ändern oder auch nicht.
Das 'htmlspecialchars()
' ist eine Sicherheits-Absicherung gegen bösartige Angriffe.
Ja, hat aber nicht nur was mit Sessions zu tun, sondern ist bei allen Ausgaben anzuwenden, wenn du nicht absolut sicher bist, dass die keine HTML-relevanten Zeichen enthalten - also im Prinzip alles was in einer Variable steht, deren Inhalt du nicht abolut sicher kennst, muss behandelt werden (Stichwort Kontextwechsel).
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ß?
In einer Multi-Anwendungen-Umgebung ist es sinnvoll, jeder Anwendung ihren eigenen session.save_path zu spendieren, sonst legen alle ihr Zeug gemeinsam ab und der mit den aggressivsten Garbage-Collection-Einstellungen putzt den anderen die Session-Dateien unabhängig von deren Verständnis von einem Timeout weg.
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???
... über URL-Parameter, Hidden-Fields im Formular. Ob der Parameter auch Auswirkungen hat, ob nur im Cookie nach der SID gesucht wird, entzieht sich meiner Kenntnis. Das Handbuch schreibt bei der Parametererläuterung nichts darüber.
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???
session.use_cookies sagt, dass überhaupt Cookies zum Transport der SID verwendet werden. session.use_only_cookies gibt an, dass diese ausschließlich verwendet werden. Wenn du ersteres auf 0 setzt, musst du die SID selbständig anderweitig übertragen.
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?
http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel
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?
Du kannst prüfen, ob die SID defined() ist oder nicht und abhängig davon das ? setzen. Ansonsten ist das Fragezeichen völlig harmlos, kein Grund sich davon genervt zu fühlen.
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?
Das ist nur die Cookie-Lebenszeit. Die Session selbst ist davon nicht betroffen. Für die gilt, dass sie mindestens session.gc_maxlifetime lang lebt. Danach darf der Garbage-Collector, der per Zufall zum Sessionstart aufgerufen wird, sie aufräumen. Zuständig für den Zufall sind die 'gc_...'-Werte.
Wenn du die Session-Daten explizit löschen willst, kannst du mit $_SESSION = array(); die Daten entfernen. Dass da noch in Cookies und anderswo die SID rumliegen kann, ist nebensächlich. Prüfe nicht, ob eine Session existiert, sondern ob in $_SESSION die für dich relevanten Daten drinstehen oder nicht. Die SID komplett wegräumen zu wollen ist vegebenen Liebesmüh.
session_destroy() [...]
kannst du zugunsten der Leeres-Array-Methode ignorieren.
Und was genau bedeutet der Parameter 'session.cache_expire' in der php.ini, der bei mir standardmäßg den Wert '180' hat?
Das hat zusammen mit session.cache_limiter nur eine HTTP-Header beeinflussende Funktion. Das gibt an, inwieweit der Browser die Seite in seinem Cache gültig lassen soll. Ist standardmäßig ausgeschaltet, weil man Session-Seiten eigentlich nicht cachen will. Auf die Lebensdauer der Session-Daten hat das keine Auswirkungen.
6.) Bei oben beschriebenen Einstellungen - bin ich auf der sicheren Seite oder ist Arbeiten mit Sessions sehr gefährlich?
SID-Diebstahl fällt mir dazu nur ein, der zu einer Session-Übernahme führen kann. Das kannst aber nicht du allein verhindern. Wenn es wirklich darauf ankommt, vergib zu solch kritischen Aktionen Einmal-IDs. Maßnahmen gegen CSRF können auch gegen Entführungen helfen.
Lo!