Matthias Jütte: Wie kontrolliere ich am besten den Seitenzugriff mit Sessions?

Hallo!

Noch immer zu meinem neuen Projekt ([pref:t=86641&m=512899]), aber anderes Thema:

Was ist die beste Art und Weise den Zugang zu einer Seite via Sessions zu kontrollieren?

Bisher benutze ich immer die Methode, eine Session zu starten, und dann beim erfolgreichen Login einer Variable $_SESSION['user'] einen Wert zuzuweisen und dann so lange den Zugang zu erlauben, wie diese Variable gesetzt ist. Wenn sich hier schon die ersten an den Kopf fassen, fühle ich mich in meiner Vermutung bestätigt, daß das nicht die feinste Art und Weise ist.

Dann gibt's da ja noch die Methode mit dem Query-String die Session-ID von Skript zu Skript zu reichen, nachdem diese beim Login in einer Datenbank-Tabelle registriert wurde, und so bei jedem Seitenaufruf auf Gültigkeit dieser SID zu prüfen.

Auch hier wieder meine Frage: welche der Methoden ist vorzuziehen (wenn man überhaupt eine davon anwenden "darf"), was wären bessere Alternativen, und wie wirken sich diese jeweils auf die Leistung des Systems aus?

Gruß

Matthias

--
ss:| zu:| ls:[ fo:| de:] va:) ch:? sh:) n4:( rl:( br:> js:| ie:% fl:) mo:}
http://www.makaio.de/quotations
  1. Moin Matthias,

    Bisher benutze ich immer die Methode, eine Session zu starten, und dann beim erfolgreichen Login einer Variable $_SESSION['user']

    So mache ich das auch.

    Gruß
    Mike

    --
    Murphy: "Wenn etwas schiefgehen kann, dann wird es auch schiefgehen."
  2. Moin!

    Was ist die beste Art und Weise den Zugang zu einer Seite via Sessions zu kontrollieren?

    Folgendes Gedankenmodell sollte es sein:
    1. Ein Besucher erzeugt immer eine neue Session. Diese Session signalisiert solange den Zustand "unbekannter, nicht eingeloggter Benutzer", bis das Gegenteil bewiesen ist durch Username und Passwort. Erst in diesem Augenblick ist der User als eingeloggt zu betrachten und hat ggf. neue Rechte.

    Wie du das genau umsetzt, ist durchaus deine freie Entscheidung. Du kannst gerne den Usernamen irgendwo speichern und als "nicht eingeloggt" den Leerstring in dieser Variable definieren, oder du hast für diverse Login-Level eine Integer-Variable, die du abfragst (z.B. 0 = nicht eingeloggt, 1 = normaler Nutzer, 2 = Admin).

    2. Du mußt die Zugangsberechtigung natürlich trotzdem irgendwie prüfen. Es hängt von deiner Applikation ab, wie genau das geschehen muß, aber eines solltest du vielleicht bedenken: Rechte können sich ändern. Es hilft dir also garnichts, wenn du beim Login feststellst, dass der Benutzer ein Admin ist, wenn diese Berechtigung nicht bei allen Dingen, die ein Admin tun darf, immer wieder geprüft wird. Denn ansonsten könntest du diesem Admin (angenommen, es ist ein Mitarbeiter, der in Ungnade gefallen ist) nicht mit sofortiger Wirksamkeit seine Rechte entziehen - das würde erst wirksam, wenn die Session abgelaufen ist und ein neuer Login notwendig wird.

    Wie böse fehlende Zugriffsberechtigungsprüfungen sind, hat die Telekom gerade mit ihrem OBSOC-Debakel demonstriert.

    Dann gibt's da ja noch die Methode mit dem Query-String die Session-ID von Skript zu Skript zu reichen, nachdem diese beim Login in einer Datenbank-Tabelle registriert wurde, und so bei jedem Seitenaufruf auf Gültigkeit dieser SID zu prüfen.

    Das ist eigentlich auch zweifelhaft. Zunächst mal: PHPs Sessionmechanismus arbeitet in dieser Beziehung eigentlich recht gut. Er bevorzugt Cookies, wenn's geht, und weicht bei Bedarf (und wenn gewünscht/konfiguriert) auf URL-Übergabe der Session-ID aus.

    Ob's nun sinnvoll ist, diese Session-ID einem bestimmten User zuzuordnen und in der DB zu speichern, hängt wieder von der konkreten Umsetzung ab. Wenn das Auslesen des Userdatensatzes dazu dient, dessen aktuelle Zugriffsrechte zu ermitteln, um zu wissen, ob er die gewünschte Aktion überhaupt tätigen darf, dann ist die Session-ID sicherlich ein ebenso geeignetes Mittel, wie die in der Session selbst gespeicherten Daten "Username" und "Passwort".

    - Sven Rautenberg