Jan: Sessions in Datenbank speichern

Hallo!

Ich möchte bei erfolgreichem Einloggen eines Users mit Benutzername und Kennwort diesem eine Session-ID zuteilen, welche in einer MySQL Datenbank abgespeichert wird! Diese Session soll über die Datenbank auf einer anderen PHP-Seite zur Verfügung stehen, da in der Session die Variable "steckt" ob der User Adminfukntionen benutzen darf oder nicht...

Hier mal ein Code-Auszug:

login.php
if (!isset ($logged_in)){
echo"<form action="$PHP_SELF" method="post">
      Benutzername:  <input name="Benutzername" type="text" size="12" maxlength="12"><br>
      Kennwort:      <input name="Kennwort" type="password" size="10" maxlength="10"><br>
      <input type="submit" value="Einloggen">
      <input type="hidden" name="logged_in">
      </form>";
}

if (isset ($logged_in)){
$login_query = mysql_query("SELECT id FROM login WHERE Name ='$Benutzername'
                                AND Kennwort ='$Kennwort'");
    $num = mysql_num_rows($login_query);
    if ($num >0){
        $login_success = "true";}
    else {$login_success = "false";}

switch($login_success)
                      {
                      case "true":
                               echo "Login erfolgreich!<br>";
                               $login_row = mysql_fetch_array($login_query);
                               $login_id = $login_row[id];
                               session_start();
                               session_register("login_success");
                               $session = session_id();
                               $login_insert_query = mysql_query("UPDATE
                               login SET Session='$session' WHERE id='$login_id'");break;

case "false":
                               echo "Login <b>nicht</b> erfolgreich!";
                               $login_row = mysql_fetch_array($login_query);
                               $login_id = $login_row[id];
                               session_start();
                               session_register("login_success");
                               $session = session_id();
                               $login_insert_query = mysql_query("UPDATE
                               login SET Session='$session' WHERE id='$login_id'");break;
}
}
?>

Hier soll die Variable der Session überprüft werden:

$session_query = mysql_query("SELECT Session FROM login");
$session_row = mysql_fetch_array($session_query);
$session_id = $session_row[Session];
session_start($session_id);
session_register ("login_success");

if ($login_success == "true")
{

PS: Die Verbindung zur Datenbank besteht, da kann der Fehler also nicht liegen!

  1. Hallo,

    Ich möchte bei erfolgreichem Einloggen eines Users mit Benutzername und Kennwort diesem eine Session-ID zuteilen, welche in einer MySQL Datenbank abgespeichert wird! Diese Session soll über die Datenbank auf einer anderen PHP-Seite zur Verfügung stehen, da in der Session die Variable "steckt" ob der User Adminfukntionen benutzen darf oder nicht...

    ich glaube, Du verwechselst da etwas. Sessions != Benutzermanagement. Mit Sessions kannst Du Variablen über mehrere PHP-Seiten verwenden. Das hat vorerst nichts mit einem Benutzermangement zu tun. Wenn Du die Sessions in einer Datenbank speichern willst, dann hilft Dir http://phpbuilder.com/columns/ying20000602.php3?page=1 sicherlich weiter.

    Dann brauchst Du noch ein Benutzermanagement. Das hat aber eigentlich nicht direkt etwas mit Sessions zu tun. Du brauchst erst mal eine Tabelle, die z.B. so aussieht:

    +--------------------+----------------+
    | Name des Feldes    | Typ            |
    +--------------------+----------------+
    | userid             | int            |  <-- primary key, auto_increment
    | username           | varchar(30)    |
    | password           | varchar(32)    |
    | sonstige Infos über den Benutzer    |
    +-------------------------------------+

    Das Passwort solltest Du übrigens als MD5-Hash abspeichern.

    Dann brauchst Du einen Code, der etwas so funktioniert:

    --------------- am Anfang jeder Seite, die nicht login/logout.php ist
    <?php
    require "session_startup.php"
    require "login_check.php"
    ...
    ----------------------------------------

    --------------- session_startup.php
    <?php
    // Funktionen zum Initialisieren des Session Managements
    // u.a. auch session_start
    ?>
    ----------------------------------------

    --------------- login_check.php
    <?php
    if (!isset ($_SESSION["user"])) {
      // Weiterleitung auf login.php falls nicht eingeloggt
      $uri = "http://" . $_SERVER["HTTP_HOST"] . dirname ($_SERVER["PHP_SELF"]) . "/login.php";
      Header ("Location: " . $uri);
      exit;
    }
    ?>
    ----------------------------------------

    --------------- login.php
    <?php
    require "session_startup.php"

    // formular wurde abgeschikt
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
      // benutzernamen und passwort prüfen
      if (prüfung war erfolgreich) {
        $_SESSION["user"] = ...;// hier kommen die user-infos rein
        // entweder eine HTTP-Weiterleitung oder die Anzeige eines
        // Begrüßungsbildschirms
        exit;
      }
      // hier nichts hin, denn wenn die prüfung nicht erfolgreich war
      // dann soll das formular noch mal angezeigt werden
    }

    ?>
    <form ...>
    ...
    </form>
    ----------------------------------------

    --------------- logout.php
    <?php
    require "session_startup.php"

    unset ($_SESSION["user"]);

    // entweder wieder eine Weiterleitung (z.B. auf login.php)
    // oder eine Anzeige, dass der Logout erfolgreich war

    ?>
    ----------------------------------------

    Grüße,

    Christian

  2. Also ich möchte ja nicht die Sessiondaten in einer Datenbank speichern, sondern nur die Session-ID damit ich diese nicht in Cookies speichern oder per URL weitergeben muss!

    Deswegen möchte ich mein Script gerne zum Laufen bringen, lokal funktioniert es auch, aber auf dem Webspace leider nicht. Dort bekomme ich die geschützten Seiten nie angezeigt obwohl User und Passwort korrekt sind!

    1. Hallo,

      Also ich möchte ja nicht die Sessiondaten in einer Datenbank speichern, sondern nur die Session-ID damit ich diese nicht in Cookies speichern oder per URL weitergeben muss!

      Und wie willst Du das anstellen? Irgendwie *musst* Du ja den Benutzer identifizieren. Wenn Du die Sessiondaten nicht in der Datenbank speichern willst, das bleibt Dir überlassen. Aber woran identifizierst Du den Benutzer wenn Du keine Session ID hast? <frage typ="rhetorisch">Ich meine, wozu sind Sessions denn da? Und wozu braucht man denn Session-IDs?</frage>

      Deswegen möchte ich mein Script gerne zum Laufen bringen, lokal funktioniert es auch,

      Das würde mich sehr wundern, wenn es überhaupt liefe. s.o.

      aber auf dem Webspace leider nicht. Dort bekomme ich die geschützten Seiten nie angezeigt obwohl User und Passwort korrekt sind!

      Was bekommst Du denn statt dessen angezeigt?

      Grüße,

      Christian

      1. Ich identifiziere den Benutzer ja durch die Session-ID indem ich diese aus der Datenbank hole. Eingetragen wurde die ID ja in der login-php, genauso wie auch die Variable login_success=true in der Session registriert wird wenn der Benutzername & Kennwort korrekt sind.
        Ich brauche ja auch keinen Benutzer korrekt identifizieren, die Seite muss nur "wissen" ob es sich um einen Admin handelt oder nicht.

        Beim Webspace komme ich nicht in den geschützten Bereich, da die Variable login_sucess scheinbar nicht auf true gesetzt wird...

        1. Hallo,

          Ich identifiziere den Benutzer ja durch die Session-ID indem ich diese aus der Datenbank hole. Eingetragen wurde die ID ja in der login-php, genauso wie auch die Variable login_success=true in der Session registriert wird wenn der Benutzername & Kennwort korrekt sind.
          Ich brauche ja auch keinen Benutzer korrekt identifizieren, die Seite muss nur "wissen" ob es sich um einen Admin handelt oder nicht.

          Das verstehe ich jetzt nicht ganz. Wenn der Client überhaupt kein Identifikationsmerkmal an den Server sendet, woher weiß der Server, dass da überhaupt eine Session vorhanden ist?

          Beim Webspace komme ich nicht in den geschützten Bereich, da die Variable login_sucess scheinbar nicht auf true gesetzt wird...

          register_globals off?

          Grüße,

          Christian

          1. Das verstehe ich jetzt nicht ganz. Wenn der Client überhaupt kein Identifikationsmerkmal an den Server sendet, woher weiß der Server, dass da überhaupt eine Session vorhanden ist?

            Guck dir doch einfach mal mein Script an, wie gesagt, lokal funktioniert es tadellos...

            1. Hallo,

              Guck dir doch einfach mal mein Script an, wie gesagt, lokal funktioniert es tadellos...

              tut es nicht. Das Script holt sich die _erste_ Zeile aus der Session-Tabelle. Damit untergräbst Du das ganze Session-Konzept, da _jeder_, der auf das Script zugreift, das gleiche Ergebnis bekommt. Warscheinlich ist in der _ersten_ Zeile deiner Online-Session-Tabelle dieses login_successful auf false gesetzt.

              Probier mal folgendes aus: Verwende lokal einen Browser und melde dich an. Nimm dann einen anderen Browser und gehe auf eine geschütze Seite. Der andere Browser bekommt Zugriff, obwohl das eigentlich nicht der Fall sein dürfte.

              Du brauchst keine Benutzerverwaltung, wenn Du solchen Code schreibst, Du brauchst dich nur einmal einzuloggen, und schon hat die ganze Welt Zugriff auf alles.

              1. Wozu willst Du überhaupt die Session ID verstecken?

              2. Was willst Du überhaupt realisieren?

              Grüße,

              Christian

              1. Probier mal folgendes aus: Verwende lokal einen Browser und melde dich an. Nimm dann einen anderen Browser und gehe auf eine geschütze Seite. Der andere Browser bekommt Zugriff, obwohl das eigentlich nicht der Fall sein dürfte.

                Nein, ich hab es ausprobiert! Der andere Browser bekommt keinen Zugriff wenn man nicht korrekt eingeloggt ist, obwohl der Admin beim anderen Browser erfolgreich eingeloggt ist.

                1. Wozu willst Du überhaupt die Session ID verstecken?

                Mir geht es ja nicht ums Verstecken sondern vielmehr darum dass ich Session-IDs ja nur mit Links übergeben kann wenn ich keine Cookies verwenden möchte. Links bestehen bei mir aber nur im Navigationsframe, von daher fubktioniert es so nicht...

                1. Was willst Du überhaupt realisieren?

                Ich habe eine Filmdatenbank mit PHP und MySQL realisiert, Filme hinzufügen, editieren und löschen soll allerdings nur der Admin können.

                1. Hallo,

                  Nein, ich hab es ausprobiert! Der andere Browser bekommt keinen Zugriff wenn man nicht korrekt eingeloggt ist, obwohl der Admin beim anderen Browser erfolgreich eingeloggt ist.

                  Das würde mich aber sehr wundern.

                  1. Wozu willst Du überhaupt die Session ID verstecken?
                    Mir geht es ja nicht ums Verstecken sondern vielmehr darum dass ich Session-IDs ja nur mit Links übergeben kann wenn ich keine Cookies verwenden möchte. Links bestehen bei mir aber nur im Navigationsframe, von daher fubktioniert es so nicht...

                  Wieso nicht? Du kannst ja beim Login das komplette Frameset neu laden. Der Navigationsframe müsste auch eine PHP-Seite sein. Wenn URL-Rewriting an ist, dann werden die Links automatisch geändert, wenn's aus ist, musst Du manuell die Session-Id einfügen.

                  Ich habe eine Filmdatenbank mit PHP und MySQL realisiert, Filme hinzufügen, editieren und löschen soll allerdings nur der Admin können.

                  Ja und? Ich meine: Wenn Du's sowieso nur als Admin brauchst, dann kannst Du doch prima Cookies verwenden. (da kannst Du es dann ja vorrausetzen) Oder Du nimmst .htaccess.

                  Grüße,

                  Christian