Hello Melvin,
ich bin zwar nicht Matthias, aber möchte auf deine Frage doch mal antworten.
unabhängig von der Machart des Login Systems: Was haltest Du davon, bei einem Loginsystem mit zeitlicher Begrenzung (also zB. automatischer Logout nach 15 Minuten) als eine _zusätzliche_ Sicherheitsstufe bei jedem Seitenaufruf nicht nur den Loginstatus zu überprüfen, sondern auch, ob die IP des Clients die selbe ist wie zum Zeitpunkt des Logins? (Was in diesem Beispiel ja maximal 15 Minuten her sein kann.)
Leider sind hier in diesem Thread verschiedene Anliegen durcheinander geraten. Darum möchte ich nochmal zusammenfassen:
Wir sprechen von HTTP 1.0 oder 1.1, also von einem Protokoll, an dem wir als PHP-Applikationsentwickler nichts ändern können.
Wir können die fehlende Session-Bindung, also ein "Stateful" Protokoll, dass in der Netzwerkschicht (z. B. TCP) grundlegend ermöglicht wird und in der Sessionschicht implemnetiert werden kann in der Applikationsschicht (also die API für PHP) nicht herstellen, ohne in die darunterliegenden Schichten einzugreifen. Wir können es bestenfalls emulieren.
Das wird bei den derzeitigen Möglichkeiten von Clients und PHP unter der Annhame, dass uns nur HTTP zur Verfügung steht, am besten realisiert werden mit Auth-Tokens, also den "Session-Cookies" von PHP.
Die andere Möglichkeit, Authenzifizierung und Authorisierungsnachweis über Http-Auth-Basic zu betreiben, ist schon eine Stufe schlechter, weil dann bei jedem Request zur Wiedererkennung sowohl Loginname als auch Passwort übermittelt werden müssen. Es sind andere Konstruktionen denlbar, aber nicht üblich.
Die Gültigkeit des Auth-Tokens bei jedem Request zu testen ist sinnvoll.
Das funktioniert bei PHP aber nur dann sinnvoll, wenn er nicht in der Sessiondatei selbt eingetragen wird, denn die ist ohne zusätzliche Maßnahmen aus Serversicht gar nicht dem User zuzuordnen (da stehen z.B. ca. 70.000 Dateien mit sess_* im Verzeichnis, welche gehört jetzt zum User?), also erfragen wir die Berechtigung doch gleich in der DB-Tabelle. Das hat bei passendem Select-Statement auch noch den Vorteil, dass wir wissen können, welche User in den letzten x Sekunden einen Request hatten. Und wir können die Session dort für ungültig erklären, ohne aus Versehen einen falschen User zu erwischen.
Eine "stateful Session" (das ist jetzt eigentlich doppelt gemoppelt) können wir selber in HTTP aber nicht aufbauen. Selbst unter Verwendung von AJAX für einen "Keep Alive Heartbeat" ist es nicht möglich, HTTP von außen zu einem symmetrischen Protokoll zu machen. Es wird bauartbedingt immer ein unsymmetrisches (definierter Client und Server) bleiben. Man unterscheidet da noch zwischen "halboffenen" und "halbgeschlossenen" Protokollen.
HTTP lässt jedenfalls keine Anfrage vom Server an den Client zu, nur Antworten auf Anfragen. Auch wenn der Client und der Server die "Verbindung" aufrecht erhalten (HTTP 1.1), ist trotzdem geregelt, dass der Server dem Client keine Requests senden darf.
Dass das in korrumpierten Systemen vielleicht trotzdem möglich ist, steht auf einem anderen Blatt.
Die Gültigkeit eines Auth-Tokens kann man leicht am Server beenden oder ihn am Client wegwerfen.
Die Gültigkeit der HTTP-Auth-Basic Credentials lässt sich auf Serverseite nur beenden, wenn man das Passwort ändert oder (noch schlechter) den User ganz deaktiviert.
Wenn ein Client keine Cookies zulässt, lässt sich eine saubere Auth-Token-Lösung nicht implementieren. Die Tokens schwirren dann immer wieder irgendwo sichtbar herum (in der URi).
Das ist aber technisch bedingt. Die Browser könnten z.B. auch eine Möglichkeit schaffen, die Credentials für Auth-Basic wieder zu vergessen, ohne (im Extremfall) das Programm beenden zu müssen.
Die IP einzubeziehen ist bei diesem Protokolltyp (HTTP) nicht sinnvoll, da es den eigentlichen Sinn des Protokolls konterkarieren würde. AOL hat uns das ganz massiv vorgeführt.
Ich habe auch bei meinem 1&1 Zugang seit längerem die IPs jeden Tag registriert. Das hat mir gezeigt, dass es auch nicht mehr sinnvoll ist, die Netzwerkanteile der IP einzubeziehen. Die wechseln auch, wenn auch bisher nur zwischen zwei Netzen, teilweise mehrmals täglich (wir haben hier öfter kurze Stromausfälle). Wenn ich aber die Lastteilung mit dem Nachbarn zuschalte, haben wir schon sechs (ich zwei, er vier) unterschiedliche Netze für unser DSL. Und die Client-Anteile variieren über die ganze Breite der C-Netze.
Beantwortet das jetzt ungefähr deine Frage?
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg