Über mich

Startseite arrow Tipps & Tricks arrow Session-IDs und W3C Validität

Session-IDs und W3C Validität

Freitag, 28. November 2008
Geschrieben von Armin Vieweg
Arbeitet man mit Sessions (oder Sitzungen) hängt PHP automatisch die Session-ID hinter die URLs und Formulare, jedoch teilweise ohne dabei die Normen der W3C einzuhalten.

Eine sogenannte Session (oder Sitzung) ist ein Cookie, dass in dem Browser des Besuchers gespeichert wird. Darin enthalten ist eine ID-Nummer. Die benötigt man um z.B. Einstellungen auf der Seite zu speichern.



Funktionsweise von Sessions
Anstatt alle Einstellung direkt in einem Cookie zu speichern, wird dort nur die Session-ID gespeichert und die verweist auf eine entsprechende Datei auf dem Server in der dann die ganzen Einträge gespeichert werden.

Eine solche Session kann man mit PHP z.B. folgendermaßen aufrufen:

session_start();
echo($_SESSION['theme']);



Das Gute ist, dass solange das Cookie beim Nutzer gespeichert ist, diese Einstellung erhalten bleiben. Der Nutzer jedoch kann diese Session nicht auslesen, lediglich die Nummer - die ihn aber nicht weiterbringt.

So könnte man duzende Informationen für den aktuellen Nutzer abspeichern, für ihn ist alles nur eine Session-ID.

Sinnvolle Anwendungsgebiete wären z.B. das automatische Ausfüllen von einem Kommentar-Formular. Einmal die persönlichen Daten dort eingetragen, werden Sie beim nächsten Besuch automatisch hinzugefügt.


Sessions ohne Cookies
Die Sitzung wird mit einer Sitzungs-ID gespeichert und zwar in einem Cookie. Habe ich meine Cookies deaktiviert bedient sich PHP einer anderen Möglichkeit. Er fügt in jeden Link auf meiner Seite ein &PHPSESSID=1234567980 dazu. So werden dann die aktuellen Einstellungen auch auf der nächsten Seite gültig, da nun klar ist wie die Session-ID lautet.

In Formularen gibt es eine ähnliche, automatische Ergänzung seitens PHP, die so aussieht:

<input type="hidden" name="PHPSESSID" value="a25bfbbd1b756da04597c350c7c462bf" />



Durch diese automatischen Ergänzungen kann dann die Session-ID auch auf die weiteren Seiten übernommen werden, ohne das Cookies aktiviert sind.


Das Problem mit Validatoren
Es gibt Standards. Und PHP verstößt mit den Aktionen teilweise dagegen. Es ist zum Beispiel nicht erlaubt in dem href eines Links einen Parameter nur mit einem &-Zeichen dranzuhängen. Laut dem Standard muss es die entsprechende HTML-Entität sein, die so aussieht: & amp;

PHP fügt leider nur ein & Zeichen hinzu und daher werden die Validatoren das als Fehler ankreiden, da sie keine Cookies annehmen.

Bei dem Input-Feld, welches an Formulare drangehangen wird ist im Prinzip alles korrekt, jedoch nur dann wenn man XHTML als Standard definiert hat. Fährt man noch mit dem normalen HTML-Standard (deklariert wird das übrigens über den DocType) ist das /> am Ende des Inputfeldes syntaktisch falsch und wird auch als Fehler markiert.



Die Lösung
Eigentlich ganz einfach: Wir müssen PHP sagen, wie er diese automatischen Ergänzungen im Falle der Verwendung von Sessions ohne Cookies, ausgeben soll.

Leichter gesagt als getan, denn das wird in der php.ini Datei vom Webserver gesteuert und nur die wenigsten haben darauf uneingeschränkten Zugriff.

Unterstützt der Webserver aber .htaccess Dateien kann man manche Variablen aus der php.ini Datei verändern. So auch die für die Ergänzung relevanten.

Einfach folgendes ganz oben in die .htaccess Datei schreiben, die sich im Root der Website befindet:

php_value arg_separator.output & amp;
php_value url_rewriter.tags a=href,area=href,frame=src,input=src,fieldset=;



Die erste Zeile macht aus dem falschen & in der URL ein & amp; (ohne Leerzeichen) und die zweite Zeile aus einem /> ein >. In der ersten Zeile muss das Leerzeichen zwischen & und amp; entfernt werden. Hier wandelt das CMS aber ein & amp; in der Ausgabe in ein & um. Daher dieser Umweg.



Das Problem fällt einem erst dann auf, wenn man die Website über einen Online-Validator wie der vom W3C testet oder lokal die Cookies deaktiviert und auch nur dann, wenn man Sessions in PHP nutzt.


Link

Quellcode-Validator vom W3C




  Kommentare (4)
 1 Geschrieben von: Lars Ebert, am 08.05.2009 um 17:20
Hallo, 
 
sehr schöner Artikel. 
Aber warum schreiben Sie bitte immer & mit Leerzeichen? 
Sie können auch einfach das & als Entity ausgeben und den Rest so, also schreiben Sie einfach & und & wird ausgegeben. 
Falls ich mich irren sollte, tut es mir leid, ich kenne schließlich das verwendete CMS nicht. 
 
Mit freundlichen Grüßen, 
 
Lars Ebert
 2 Geschrieben von: Armin Vieweg, am 10.05.2009 um 12:19
Hallo Lars, 
 
ja das ist ein nerviges Problem. & wird nur als &-Zeichen ausgegeben. Daher die Leertaste dazwischen. Bin nur leider noch nicht dazu gekommen, diesen "Bug" zu fixen. 
 
Gruß 
Armin
 3 Geschrieben von: Petra, am 21.03.2010 um 08:26
Hallo Armin, 
 
jetzt habe ich schon so viel ausprobiert um meine Seite valide zu bekommen.  
Wenn ich 
php_value arg_separator.output & 
php_value url_rewriter.tags a=href,area=href,frame=src,input=src,fieldset=; 
in die .htaccess Datei schreibe und hochlade, bekomme ich einen 500 Fehler 
wieso klappt es nicht ? 
 
Gruß Petra
 4 Geschrieben von: Armin Vieweg, am 21.03.2010 um 18:23
Hallo Petra, 
 
damit man in der htaccess-Dateien Variablen von PHP ändern kann, muss das erlaubt sein. Das wird innerhalb der Konfiguration vom Apache-Webserver gesteuert. Dort stehen, wenn es denn erlaubt ist, solche Schlüsselwörter wie "AllowOverride All" oder "AllowOverride Options". Das Erlauben vom Überschreiben der Optionen würde in diesem Fall schon ausreichen. 
 
Hier gibt es auch einen Artikel dazu: 
http://php.net/manual/de/configuration.changes.php 
 
 
Entweder fragst Du mal Deinen Provider ob der das für Dich aktiviert oder direkt in der php.ini die Werte oben ändern. Falls er sich weigert, kannst Du die PHP-Konfiguration auch über einen PHP-Befehl ändern. 
 
Die Funktion heißt ini_set: 
http://www.php.net/manual/de/function.ini-set.php 
 
Deine Befehle sähen dann so aus: 
ini_set('arg_separator.output', '& amp;'); //ohne das Leerzeichen nach dem & 
ini_set('url_rewriter.tags', 'a=href,area=href,frame=src,input=src,fieldset=; '); 
 
Ich weiß nicht, was Du für eine Seite hast und ob Du ein CMS im Einsatz hast, aber bei den meisten CMS (z.B. Joomla, Wordpress, etc.) kann man diesen PHP-Befehl zentral platzieren, so dass er immer ausgeführt wird, wenn man eine Seite öffnet, was dann den gleichen Effekt hat, als würde man den Wert in der Config von PHP direkt ändern. 
 
Ich würde mich freuen zu Erfahren, ob einer der Tipps funktioniert hat =D 
 
Schönen Gruß 
Armin
Letzte Aktualisierung ( Montag, 30. März 2009 )
 
< Zurück   Weiter >