Hauke Hammerich: Kurze Frage zu Sessions!

Hallo Forum!

Ich habe eine Frage und zwar habe ich einen Internbereich in dem Nur bestimmte Benutzer Zutritt haben. Wenn ich nun auf die Formularseite komme wird eine Session gestartet. Beim einloggen wird dann die IP und der Benutzername in der Session gespeichert.
Das klappt soeit auch und die Folgeseite des Internbereichs wird angezeigt. Ich kann mich auch ausloggen etc.
Nun möchte ich aber auch die Session an Folgeseiten über die URL weitergeben und dort überprüfen ob die Daten stimmen.

Kann man das folgendermaßen lösen?

"<a href="index.php?section=intern&amp;".SID.">"

Habe aber gemerkt das hier nicht die SessionID an die URL angehängt wird.

Wie kann man auch noch überprüfen ob die Session noch existiert?
Reicht dafür ein einfaches
if(isset($_SESSION['ID'] ?

Gruß
Hauke

  1. Moin!

    Nun möchte ich aber auch die Session an Folgeseiten über die URL weitergeben und dort überprüfen ob die Daten stimmen.

    Warum über die URL? Standardmäßig werden Cookies benutzt, die sind für sowas viel besser geeignet.

    "<a href="index.php?section=intern&amp;".SID.">"

    Habe aber gemerkt das hier nicht die SessionID an die URL angehängt wird.

    Das ist typisch für PHP-Sessions, wenn Cookies benutzt werden.

    Wie kann man auch noch überprüfen ob die Session noch existiert?
    Reicht dafür ein einfaches
    if(isset($_SESSION['ID'] ?

    Was soll das prüfen?

    Prüfe nicht, ob die Session noch existiert. Du kannst davon ausgehen, dass der PHP-interne Mechanismus mit Cookies sehr gut und mit der Alternative über URL und Formularfelder gut funktioniert, so dass die Session eigentlich garantiert immer weiter getragen wird von Seite zu Seite.

    Was du prüfen mußt ist, ob der Benutzer Zugriff auf die jeweilige Seite haben darf - und zwar bei jedem neuen Seitenzugriff auf deinen internen Bereich. Die Existenz einer Session beweist nichts, die kann jedermann ganz einfach starten.

    - Sven Rautenberg

    1. Hi,

      Nun möchte ich aber auch die Session an Folgeseiten über die URL weitergeben und dort überprüfen ob die Daten stimmen.

      Warum über die URL? Standardmäßig werden Cookies benutzt, die sind für sowas viel besser geeignet.

      ich habe nie verstanden wofuer Cookies geschaffen worden sind. Meine (zugegebenermassen schwache) Antwort war, dass man benutzerspezifische Einstellungen fuer einen Rechner auf diese Art und Weise speichern kann. Gibt es eine bessere Antwort?

      Sessionhandling per URL-Verweisuebergabe ist zwar etwas uncool, weils in den Logs und der Browser-History landet, aber eigentlich spricht nichts dagegen (wenn die Nutzer sich immer lieb ausloggen, meine ich ;-).

      Und wenn das o.g. nicht OK ist, dann kann man die Sessionverweise natuerlich auch per POST hin- und herreichen.

      Gruss,
      Ludger

      1. Moin!

        ich habe nie verstanden wofuer Cookies geschaffen worden sind.

        Weil Netscape-Entwickler meinten, dass sie notwendig sind.

        Sessionhandling per URL-Verweisuebergabe ist zwar etwas uncool, weils in den Logs und der Browser-History landet, aber eigentlich spricht nichts dagegen (wenn die Nutzer sich immer lieb ausloggen, meine ich ;-).

        Gegen Cookie-basierte Sessions spricht auch nichts, das ist hinsichtlich des Ausloggens genauso kritisch oder unkritisch, und hinsichtlich der Betriebssicherheit sogar noch besser.

        Und wenn das o.g. nicht OK ist, dann kann man die Sessionverweise natuerlich auch per POST hin- und herreichen.

        Man kann sich auch einen Stacheldraht durch den Bauchnabel ziehen und Halleluja singen.

        - Sven Rautenberg

        1. Hi,

          Gegen Cookie-basierte Sessions spricht auch nichts, das ist hinsichtlich des Ausloggens genauso kritisch oder unkritisch, und hinsichtlich der Betriebssicherheit sogar noch besser.

          ja, doch, es gibt LAN-Betreiber, die Cookies firmenintern abschalten. (Mit "domain policies" und so)

          Gruss,
          Ludger

    2. Moin!

      Nun möchte ich aber auch die Session an Folgeseiten über die URL weitergeben und dort überprüfen ob die Daten stimmen.

      Warum über die URL? Standardmäßig werden Cookies benutzt, die sind für sowas viel besser geeignet.

      "<a href="index.php?section=intern&amp;".SID.">"

      Habe aber gemerkt das hier nicht die SessionID an die URL angehängt wird.

      Das ist typisch für PHP-Sessions, wenn Cookies benutzt werden.

      OK, Das heißt also das ich gerade schon Cookies benutz?

      Wie kann man auch noch überprüfen ob die Session noch existiert?
      Reicht dafür ein einfaches
      if(isset($_SESSION['ID'] ?

      Was soll das prüfen?

      Prüfe nicht, ob die Session noch existiert. Du kannst davon ausgehen, dass der PHP-interne Mechanismus mit Cookies sehr gut und mit der Alternative über URL und Formularfelder gut funktioniert, so dass die Session eigentlich garantiert immer weiter getragen wird von Seite zu Seite.

      Was du prüfen mußt ist, ob der Benutzer Zugriff auf die jeweilige Seite haben darf - und zwar bei jedem neuen Seitenzugriff auf deinen internen Bereich. Die Existenz einer Session beweist nichts, die kann jedermann ganz einfach starten.

      • Sven Rautenberg

      Ok. Also muss ich auf jeder Internseite überprüfen ob der User ein Recht hat dort hinzukommen.
      Ich muss also jedes mal die aus dem POST übergebenen Werte abfragen und mit den Werten in der DB überprüfen?
      Oder gibt es eine ander Lösung?

      Wird die Session eigentlich außer beim Logout dann auch beim schließen des Fensters auf dem Server gelöscht wenn ich Cookies benutze?

      Gruß
      Hauke

      Und schonmal danke für die Antwort!

      1. Moin,

        Ok. Also muss ich auf jeder Internseite überprüfen ob der User ein Recht hat dort hinzukommen.
        Ich muss also jedes mal die aus dem POST übergebenen Werte abfragen und mit den Werten in der DB überprüfen?
        Oder gibt es eine ander Lösung?

        Du mußt den Wert in die Session schreiben und prüfen ob jener Wert vorhanden ist.
        Du hast das System von Sessions noch nicht richtig verstanden.
        http://tut.php-q.net/sessions.html
        Sollte Dir helfen zu verstehen was Sessions so alles treiben.

        Wird die Session eigentlich außer beim Logout dann auch beim schließen des Fensters auf dem Server gelöscht wenn ich Cookies benutze?

        Nein..

        TomIRL

      2. Moin!

        Das ist typisch für PHP-Sessions, wenn Cookies benutzt werden.

        OK, Das heißt also das ich gerade schon Cookies benutz?

        Mit ziemlicher Sicherheit: Ja.

        Ok. Also muss ich auf jeder Internseite überprüfen ob der User ein Recht hat dort hinzukommen.

        Genau. Und die Information dazu sind Benutzername und Passwort, die der Benutzer mal angegeben hat, auf der einen Seite, und die Berechtigungsstruktur der Benutzerdatenbank (eine simple Textdatei, in der das irgendwie drinsteht, fällt auch unter diese Kategorie - das muß nichts mySQL-mäßiges sein) auf der anderen Seite.

        Die Session ist nur dazu da, die einmal getätigte Angabe von Benutzername und Passwort zu speichern und auf jeder Seite der Berechtigungsprüfung zur Verfügung zu stellen.

        Diese Prüfung muß immer gegen die aktuelle Benutzerdatenbank durchgeführt werden, du solltest die Berechtigungen nicht in der Session selbst speichern. Andernfalls wäre es möglich, dass jemand sich einloggt, du dessen Account danach dann schließt, er aber mit seinem Login weiterhin lustig alles tun dürfte, was er mal tun durfte. Er würde erst ausgesperrt, wenn seine Session aufgrund von Inaktivität abgelaufen ist oder er sich ausloggt und später wieder einloggen will.

        Ich muss also jedes mal die aus dem POST übergebenen Werte abfragen und mit den Werten in der DB überprüfen?
        Oder gibt es eine ander Lösung?

        Dein ganzer interner Bereich vergibt an jeden, der eine Seite von dort abruft, eine Session-ID. Das geschieht schlicht dadurch, dass auf jeder Seite session_start() aufgerufen wird, weil sonst die Session ja ohnehin nicht funktioniert.

        Jede Seite prüft dann, ob die in der Session gespeicherten Anmeldedaten (Username, Passwort) in der Weise gültig sind, dass dieser Benutzer die Seite betrachten darf. Falls ja, dann wird die Seite ausgegeben.

        Dir wird auffallen, dass ein nicht eingeloggter User natürlich noch keinerlei Anmeldedaten in seiner Session haben kann - deswegen leitet jede Seite den Benutzer auf die Anmeldeseite weiter, wenn die Seite feststellt, dass die Anmeldedaten nicht gültig sind, um die Seite zu betrachten.

        Die Anmeldeseite selbst sorgt lediglich dafür, dass der Benutzer ein Formular angezeigt bekommt, und sie trägt die vom Benutzer angegebenen Anmeldedaten in die Session (also das Array $_SESSION) ein.

        Du könntest an dieser Stelle natürlich noch einen kleinen Mechanismus einbauen, der dafür sorgt, dass der Benutzer nach erfolgter Anmeldung wieder zur ursprünglich gewünschten Seite weitergeleitet wird, nachdem er die Anmeldedaten übermittelt hat - ganz wie du meinst.

        Wird die Session eigentlich außer beim Logout dann auch beim schließen des Fensters auf dem Server gelöscht wenn ich Cookies benutze?

        Die Session selbst wird niemals gelöscht - zumindest solltest du es so betrachten. Zwar räumt PHP selbst unbenutzte alte Session-Daten mit einem gewissen Wahrscheinlichkeitswert auf, darauf sollte man sich aber nicht wirklich verlassen.

        Damit einmal erfolgte Logins nicht endlos gültig sind, solltest du in den Session-Daten auch eine Zeit abspeichern, um zu lange unbenutzte Logins ebenfalls aussperren zu können. Das geht im Prinzip ganz einfach:
        Damit jemand Zugriff auf eine gesperrte Seite haben darf, muß die letzte Aktivitätsuhrzeit weniger als z.B. 60 Minuten zurückliegen, und Username und Passwort müssen natürlich stimmen.

        Wenn das der Fall ist, setzt du in den Session-Daten die Aktivitätsuhrzeit auf die aktuelle Uhrzeit - auf diese Weise bleibt der Login bei Aktivität des Benutzers erhalten, und du hast einen sehr exakten Mechanismus zum zeitgesteuerten Logout.

        Wenn der Benutzer eigenständig einen Logout veranlassen möchte, dann setzt du z.B. Username und Passwort auf den Leerstring - die Prüfung auf jeder Seite wird ihn dann nicht mehr unangemeldet reinlassen.

        - Sven Rautenberg

        1. Hallo!

          Also erstmal danke für Deine sehr ausführliche Antwort! :-))

          Moin!

          Das ist typisch für PHP-Sessions, wenn Cookies benutzt werden.

          OK, Das heißt also das ich gerade schon Cookies benutz?

          Mit ziemlicher Sicherheit: Ja.

          Ok. Also muss ich auf jeder Internseite überprüfen ob der User ein Recht hat dort hinzukommen.

          Genau. Und die Information dazu sind Benutzername und Passwort, die der Benutzer mal angegeben hat, auf der einen Seite, und die Berechtigungsstruktur der Benutzerdatenbank (eine simple Textdatei, in der das irgendwie drinsteht, fällt auch unter diese Kategorie - das muß nichts mySQL-mäßiges sein) auf der anderen Seite.

          Die Session ist nur dazu da, die einmal getätigte Angabe von Benutzername und Passwort zu speichern und auf jeder Seite der Berechtigungsprüfung zur Verfügung zu stellen.

          Diese Prüfung muß immer gegen die aktuelle Benutzerdatenbank durchgeführt werden, du solltest die Berechtigungen nicht in der Session selbst speichern. Andernfalls wäre es möglich, dass jemand sich einloggt, du dessen Account danach dann schließt, er aber mit seinem Login weiterhin lustig alles tun dürfte, was er mal tun durfte. Er würde erst ausgesperrt, wenn seine Session aufgrund von Inaktivität abgelaufen ist oder er sich ausloggt und später wieder einloggen will.

          Ich muss also jedes mal die aus dem POST übergebenen Werte abfragen und mit den Werten in der DB überprüfen?
          Oder gibt es eine ander Lösung?

          Dein ganzer interner Bereich vergibt an jeden, der eine Seite von dort abruft, eine Session-ID. Das geschieht schlicht dadurch, dass auf jeder Seite session_start() aufgerufen wird, weil sonst die Session ja ohnehin nicht funktioniert.

          Jede Seite prüft dann, ob die in der Session gespeicherten Anmeldedaten (Username, Passwort) in der Weise gültig sind, dass dieser Benutzer die Seite betrachten darf. Falls ja, dann wird die Seite ausgegeben.

          Ok, das habe ich verstanden. Die Sessio-ID bleibt ja für den Zeit der Anmeldung einmalig und wird trotz des "mehrmaligen" Startens nicht überschrieben bzw. jedesmal eine neue Session gestartet? Richtig?
          Zur Zeit bekomme ich es aber nur hin das ich nur den Namen in die Session gespeichert bekomme.
          Quellcode sieht folgendermaßen aus:

          $_SESSION['ID'] = $_POST['username'];

          Kann ich jetzte in dem ich in einer if-Schleife folgendes schreibe:

          if(blalala)
          {
          $_SESSION['ID'] = $_POST['username'];
          $_SESSION['ID'] = $_POST['password];
          }

          Den Benuzternamen und Passwort in die Session-ID schreiben?

          Wenn ich noch mehr Datenvergeleiche haben will sollte ich die dann auch in dei Session schreiben?

          Dir wird auffallen, dass ein nicht eingeloggter User natürlich noch keinerlei Anmeldedaten in seiner Session haben kann - deswegen leitet jede Seite den Benutzer auf die Anmeldeseite weiter, wenn die Seite feststellt, dass die Anmeldedaten nicht gültig sind, um die Seite zu betrachten.

          Die Anmeldeseite selbst sorgt lediglich dafür, dass der Benutzer ein Formular angezeigt bekommt, und sie trägt die vom Benutzer angegebenen Anmeldedaten in die Session (also das Array $_SESSION) ein.

          Du könntest an dieser Stelle natürlich noch einen kleinen Mechanismus einbauen, der dafür sorgt, dass der Benutzer nach erfolgter Anmeldung wieder zur ursprünglich gewünschten Seite weitergeleitet wird, nachdem er die Anmeldedaten übermittelt hat - ganz wie du meinst.

          Wird die Session eigentlich außer beim Logout dann auch beim schließen des Fensters auf dem Server gelöscht wenn ich Cookies benutze?

          Die Session selbst wird niemals gelöscht - zumindest solltest du es so betrachten. Zwar räumt PHP selbst unbenutzte alte Session-Daten mit einem gewissen Wahrscheinlichkeitswert auf, darauf sollte man sich aber nicht wirklich verlassen.

          Damit einmal erfolgte Logins nicht endlos gültig sind, solltest du in den Session-Daten auch eine Zeit abspeichern, um zu lange unbenutzte Logins ebenfalls aussperren zu können. Das geht im Prinzip ganz einfach:
          Damit jemand Zugriff auf eine gesperrte Seite haben darf, muß die letzte Aktivitätsuhrzeit weniger als z.B. 60 Minuten zurückliegen, und Username und Passwort müssen natürlich stimmen.

          Wenn das der Fall ist, setzt du in den Session-Daten die Aktivitätsuhrzeit auf die aktuelle Uhrzeit - auf diese Weise bleibt der Login bei Aktivität des Benutzers erhalten, und du hast einen sehr exakten Mechanismus zum zeitgesteuerten Logout.

          Also eine Timestemp in die Session-ID setzen?

          Wenn der Benutzer eigenständig einen Logout veranlassen möchte, dann setzt du z.B. Username und Passwort auf den Leerstring - die Prüfung auf jeder Seite wird ihn dann nicht mehr unangemeldet reinlassen.

          Ok. Also in die Session-ID wird nix hineingeschrieben bzw. die Daten mit leerem inhalt überschrieben.

          • Sven Rautenberg

          Gruß
          Hauke

          btw.: Weißt Du eine gute Adresse wo das ganze, in deutsch, gut und verständlich nochmals zum nachlesen erklärt ist?

          1. Moin,

            btw.: Weißt Du eine gute Adresse wo das ganze, in deutsch, gut und verständlich nochmals zum nachlesen erklärt ist?

            Ich hab Dir den zwar schon mal geschickt aber hier noch einmal:
            http://tut.php-q.net/login.html
            TomIRL

            1. Moin,

              btw.: Weißt Du eine gute Adresse wo das ganze, in deutsch, gut und verständlich nochmals zum nachlesen erklärt ist?
              Ich hab Dir den zwar schon mal geschickt aber hier noch einmal:
              http://tut.php-q.net/login.html
              TomIRL

              Die habe ich schon gelesen, aber wirklich gut und ausführlich ist das leider nicht erklärt!

              1. Moin,

                Die habe ich schon gelesen, aber wirklich gut und ausführlich ist das leider nicht erklärt!

                Dann solltest Du dann doch noch einmal ein bischen genauer erklären was Du haben willst...
                Ich Ein einfaches Sessionbasiertes Loginsystem sollte ein halbwegs Kompetenter Programmierer in ner Stunde zusammenbasteln können.
                Also was willst wissen.
                Wir heben Dich dann über die Klippen hinweg.

  2. Hallo!

    Ich habe eine Frage und zwar speicher ich folgende Daten aus einem Formular in der Session:

    $_SESSION['username'] = $_POST['username'];
    $_SESSION['password'] = $_POST['password'];
    $_SESSION['IP'] = $_SERVER['REMOTE_ADDR'];
    $_SESSION['TIME'] = time();

    Das klappt auch!
    Nun möchte ich die Daten gerne an einen weitere Seite senden un dort die Daten mit den Daten aus der MySQL_DB überprüfen!
    Doch es funktioniert nicht bzw. das auslesen des Arrays Session dort geht nicht.
    Wie stellt man das am besten an?

    Gruß
    Hauke

    1. Hallo!

      Ich habe eine Frage und zwar speicher ich folgende Daten aus einem Formular in der Session:

      $_SESSION['username'] = $_POST['username'];
      $_SESSION['password'] = $_POST['password'];
      $_SESSION['IP'] = $_SERVER['REMOTE_ADDR'];
      $_SESSION['TIME'] = time();

      Das klappt auch!
      Nun möchte ich die Daten gerne an einen weitere Seite senden un dort die Daten mit den Daten aus der MySQL_DB überprüfen!
      Doch es funktioniert nicht bzw. das auslesen des Arrays Session dort geht nicht.

      Lese Dir die folgende "Anmerkung" im Session-Kapitel des Manuals nochmal genau durch: http://de3.php.net/manual/de/ref.session.php#session.examples (ich gehe mal davon aus dass Du das Session-Kapitel im Manual schon gelesen hast).

      Dann hilft Dir vielleicht noch:
      http://php-faq.de/q/q-sessions-wie.html und
      http://php-faq.de/q/q-sessions-anzeigen.html

      Grüße
      Andreas

      PS: ich würde ein Passwort nicht im Klartext in die Session schreiben, weil das im Shared-Hosting normalerweise jeder andere Kunde auslesen kann.

      --
      SELFHTML Feature Artikel: http://aktuell.de.selfhtml.org/artikel/
      1. Moin

        PS: ich würde ein Passwort nicht im Klartext in die Session schreiben, weil das im Shared-Hosting normalerweise jeder andere Kunde auslesen kann.

        Ich würde ein Passwort überhaupt nicht in eine Variable die übergeben wird schreiben, sondern, ich würde nach der Überprüfung von Passwort und Username eine USER ID reinschreiben, die ich dann lediglich auf Ihre Gültigkeit hin auswerte.
        TomIRL

        1. Hallo!

          Ich würde ein Passwort überhaupt nicht in eine Variable die übergeben wird schreiben, sondern, ich würde nach der Überprüfung von Passwort und Username eine USER ID reinschreiben, die ich dann lediglich auf Ihre Gültigkeit hin auswerte.

          Bedenke nur, dass eine PHP-Session bei den meisten Installationen für alle Virtual Hosts gilt, also für alle Kunden auf dem Server. Das heißt, bei Kenntnis eines Usernames könnte ein anderer Kunde einfach eine passende Session erstellen, und die Session-ID an Deinen Vhost schicken, und ist eingeloggt.

          Grüße
          Andreas

          --
          SELFHTML Tipps & Tricks: http://aktuell.de.selfhtml.org/tippstricks/
          1. Moin,

            Bedenke nur, dass eine PHP-Session bei den meisten Installationen für alle Virtual Hosts gilt, also für alle Kunden auf dem Server. Das heißt, bei Kenntnis eines Usernames könnte ein anderer Kunde einfach eine passende Session erstellen, und die Session-ID an Deinen Vhost schicken, und ist eingeloggt.

            Hm ich glaube bei 1und1 das dies nicht so ist.
            Aber wie bekommt man das raus?
            Und kann man das serverseitig unterbinden?
            Zum Besipiel ne eigen SSID bauen oder so?

            TomIRL