Moin!
Hallo Sven
OPS: Nimm niemals mehr session_register(). Du hast in PHP die Variable $_SESSION, die kannst du als Array verwenden und dort alles reinspeichern, was du brauchst.
Weil du es grad ansprichst: Wieso sollte man man denn nicht session_register() verwenden?
Weil es böse ist. Weil es von den PHP-Entwicklern verdammt wurde. Und weil es sicherlich deswegen irgendwann aus dem Funktionsumfang entfernt werden wird.
Die Sache ist die: Früher hat man bei PHP einen anderer Ansatz verfolgt, Daten von "außen" entgegenzunehmen. Dieser Ansatz hat sich als äußerst problematisch erwiesen, weil die Programmierer nicht die notwendige Sorgfalt für saubere Programmierung an den Tag gelegt haben. Viele unnötige, aber gefährliche Sicherheitslücken in den Skripten waren die Folge.
Zusammenfassen kann man diese Misere unter dem Stichwort: register_globals=on
Und die Wirkung war, dass die Parameter aus GET, die Formularfelder aus POST, alle Werte aus COOKIES, die SERVERumgebung und das ENVironment, und auch die SESSIONvariablen alle als globale Variablen angelegt wurden. Aus /link.php?var=wert wurde z.B. $var.
Das hat mehrere Probleme. Zum einen ist es sehr problematisch, wenn man als Angreifer einfach beliebige globale Variablen mit Werten vorbelegen kann, indem man einfach einen ?-Parameter an den Link dranhängt. Wenn der Programmierer nicht sehr vorsichtig agiert und alle benutzten Variablen zuerst mit einem Startwert initialisiert, dann ist das Skript dadurch unsicher. Beispiele dazu gibts genug im Archiv.
Zweitens kann man auf diese Weise nicht denselben Parameternamen in mehreren Quellen verwenden. Wenn ein POST-Formularfeld "login" heißt, und ein COOKIE-Wert ebenso, dann gibt es zwangsläufig einen Konflikt, weil es eben nur eine Variable $login geben kann - welcher Wert steht da jetzt drin, der vom POST oder der vom COOKIE? Antwort: Es hängt davon ab. In PHP kann man die Reihenfolge, in der GET, POST, COOKIE, SERVER und ENV ausgewertet werden, beliebig festlegen. Standard ist "EGPCS", es werden also zuerst die Werte aus $_ENV, dann $_GET, $_POST, $_COOKIE und zuletzt $_SERVER in den globalen Namensraum getan - das COOKIE in meinem Beispiel würde also den Wert aus POST überschreiben. Und sowas ist ziemlich doof, denn man muß bei Dingen, die eigentlich nichts miteinander zu tun haben (die Wahl, welche Namen ich für meine Cookies wähle, ist vom Prinzip her ja völlig frei, genauso wie ich (oder jemand anderes, der mitarbeitet) ja vollkommen frei Formularfeldnamen wählen kann. Wenn ich also in meinem Cookieskript den Parameter "login" setzte, und irgendwo anders benutzt jemand ein Formularfeld gleichen Namens, dann stört mein Cookie sein Formularfeld, wenn er sich auf register_globals = on verläßt und nur $login benutzt. Denn Cookies werden an alle Skripte der gesamten Domain gesendet (man kann es einschränken, aber das geht aus anderen Gründen nicht immer).
Deshalb ist die einzige Lösung: register_globals = off, und die Werte aus den jeweiligen Arrays holen: Das Cookie-Login aus $_COOKIE['login'], und das Formular-Login aus $_POST['login'].
So weit, so gut. Was ist jetzt mit Sessions?
Für die soll das Gleiche gelten! Es gibt deshalb also das Array $_SESSION, damit man dort alle Variablen reinspeichert, die per Session-Mechanismus an alle anderen Skripte weitergegeben werden sollen. So kann man ohne Probleme auch noch eine Session-Variable $_SESSION['login'] definieren, und in allen dreien können unterschiedliche Werte drinstehen, weil vielleicht drei verschiedene Programmierer desselben Projektes drei vollkommen verschiedene Inhalte definiert haben, nur zufällig mit demselben Namen.
Wenn du aber mit session_register() arbeitest, dann übergibst du ja der Funktion den Namen der globalen Variablen, die in die Session gespeichert und später wiederhergestellt werden soll.
Das Wiederherstellen ist dabei wieder das Problem. Angenommen, du oder jemand anderes programmiert noch ein weiteres Skript, was die Session ebenfalls benutzt. Der hat, bevor er session_start() macht, noch diverse Berechnungen und Prüfungen auszuführen, und speichert das Ergebnis dann in der Variablen $result.
Wenn du jetzt irgendwo in deinen anderen Session-Skripten irgendwo session_register("result") machst, weil du irgendein Ergebnis in der Session sichern wolltest, dann wird in dem neuen Skript nach session_start() die vorher errechnete Variable $result überschrieben durch den Inhalt der Session-Variablen.
Es ist also das gleiche Thema: Die Werte der Session sollen gefälligst in $_SESSION bleiben, und nicht unkontrolliert von dort aus in den globalen Namensraum eindringen.
Sowas kann nämlich auch zu tollen Problemen führen. Angenommen, du programmierst und machst dabei einen Fehler: Du registrierst die Variable $result in der Session, obwohl du das garnicht wolltest. Also löschst du den Befehl session_register("result") wieder, willst aber die Variable $result natürlich als Nicht-Session-Variable weiterverwenden. Nur dummerweise: Durch das einmalige session_register() ist diese Variable in deiner Session zu einer Session-Variablen geworden, d.h. immer wenn du session_start() aufrufst, wird in $result der Wert gespeichert, den du irgendwann man irrtümlich dort reingespeichert hattest. Es hängt natürlich von deinem Skript ab, was für Auswirkungen das hat, aber du wirst dir vorstellen können, dass du irgendwann verzweifelst, wenn dein Skript, was offensichtlich doch funktionieren muß, immer wieder mit falschen Inhalten von $result Probleme macht, und du dir nicht erklären kannst, woher das kommt.
Wenn du nur $_SESSION verwendest, bist du dir sicher, dass alle globalen Variablen wirklich jedesmal neu und unverfälscht sind, und dass alle Session-Variablen gesammelt in diesem Array stehen (da kann man dann auch mal nachgucken, was so alles drin gespeichert ist: var_dump($_SESSION) beispielsweise).
- Sven Rautenberg