Ich habe die Stelle auf der PHP-Seite wiedergefunden, an der ich mal darüber gelesen hatte: http://de3.php.net/manual/de/ref.session.php#session.idpassing
Dort steht doch:
"Anmerkung: Bei nichtrelativen URLs wird davon ausgegangen, dass sie auf externe Seiten zeigen und deshalb keine SID angehängt, weil es ein Sicherheitsrisiko wäre, die SID an einen anderen Server zu übermitteln."
Also sind externe Links doch keine Gefahr!?
Das kann man so nicht grundsätzlich sagen.
Dein Zitat bezieht sich auf das Feature "session_trans_sid", also dem automatischen Anhängen der Session-ID an Links, wenn PHP noch kein Session-Cookie festgestellt hat (das ist mindestens beim ersten Request der Fall).
PHP hängt nicht blind an alle Links die Session-ID dran, sondern nur an Links, die es als "lokal" betrachtet. Auf diese Weise wird tatsächlich vermieden, dass die Session-ID über die aufgerufene URL auf Drittserver gelangt.
Aber auf den Referrer wirkt der Mechanismus nicht! Wenn also zu irgendeiner Zeit eine Seite mit Session-ID in der URL im Browser geladen ist, wird jeder Link auf externe Server diese Session-ID im Referrer an fremde Server senden - sofern der Browserbenutzer das nicht individuell bei sich unterbunden hat, worauf man sich aber nicht verlassen sollte.
Wie ist es bei Bildern, erscheint in den Access-Logs die Session-ID in der Referer-URL?
Aber klar doch.
Wird nicht auch dort die SID automatisch gestrichen?
Nein, warum denn?
Nur der Browser ist für die Erzeugung der Referrer-Angabe verantwortlich. Der Browser weiß nichts von PHP, und es ist auch unzumutbar, den Browserherstellern aufzudrücken, doch bitteschön die Session-ID von PHP rauszufiltern. Das ist nämlich ein Ding der Unmöglichkeit aus zwei Gründen:
1. Der Parametername ist nicht fest "PHPSESSID", sondern kann frei gewählt werden. Siehe http://www.php.net/session-name
2. Die eigentliche Session-ID ist nicht fest, sondern kann frei gewählt werden (PHP macht hinsichtlich der erlaubten Zeichen Einschränkungen, aber Form und Länge sind beliebig). Siehe http://www.php.net/session-id.
Daraus folgt: Es gibt keine Möglichkeit, einen allgemeinen URL-Parameter-Filter zu programmieren, weil potentiell jeder Parameter eine Session-ID sein könnte. Von dem nicht so unwahrscheinlichen Fall, dass die Session-ID sich im Pfadnamen befindet, mal abgesehen.