Erri: Problem bei LoginScript... Plötzlich anderer User eingeloggt

Guten Morgen,

ich habe ein Problem bei meinem Login Script, was ich mir einfach nicht erklären kann.
Ich hoffe, dass ihr mir evtl. Tipps geben könnt.
Ersteinmal möchte ich kurz das Problem erläutern:
Auf meiner Seite login.php logge ich mich als ein User (z.B. "webmaster") ein.
Danach wird angezeigt: Du bist eingeloggt als Webmaster...
Rufe ich nun eine andere Seite auf, wird merkwürdige Weise angezeigt, du bist eingeloggt als irgendein_anderer_user  (das steht auch in $_SESSION)...
Obwohl ich mich nie als dieser User angemeldet habe, geschweige denn dieses Passwort eingegeben habe, sondern als User "webmaster".

Nun zum Skript:

Alle meine Seiten, initialisiere ich zu Beginn die Session mit:

session_start();

Auf meiner Seite login.php logge ich mich als ein User (z.B. "webmaster") ein...
Bei erfolgreicher Passwortüberprüfung, schreibe ich den Usernamen in die Session:
(Da die Passwortprüfung funktioniert, poste ich erstmal nur den Teil, wie ich den usernamen in die Session schreibe...)

//LOGIN ERFOLGREICH nach erfolgreicher PW-Prüfung
   $_SESSION["username"] = $txt_username;
   echo '<div style="font-weight:bold;">Der Login war erfolgreich</div>';

Anschließend habe ich tesweise die beiden Arrays $_COOKIE sowie $_SESSION ausgelesen:
   print_r ($_COOKIE);
   print_r ($_SESSION);

In denen steht nun bspw.
   Array ( [PHPSESSID] => 5808abfb4dc331aa3894592bc88268e0 )
   Array ( [username] => webmaster )

Nun überprüfe ich auf jeder Seite den Login und gebe entweder eine Nachricht "Du bist eingeloggt als xxx"  bzw. ein Loginformular aus:
An dieser Stelle wird dann nach dem Aufrufen einer beliebigen Seite, wie bereits oben geschrieben, auf einmal angezeigt, dass ein anderer User, als der, mit dem der Login durchgeführt wurde, angemeldet ist.

if(!isset($_SESSION["username"]))
  {
   echo  //Hier erscheint das Login Formular
  }
  else
  {
     // Verbindung zum Datenbankserver
     db_connect();

$login_user_tmp = $_SESSION["username"];
      $sql = mysql_query("SELECT firstname, surname, username FROM tbl_users WHERE username='$login_user_tmp' LIMIT 1");
      $login_user = mysql_fetch_array($sql);
      if ($login_user){
        echo '<div style="text-align:center">Du bist eingeloggt:<br><b>'.
             $login_user['firstname'] .'&nbsp;'. $login_user['surname'] .'</b><br>('.$login_user['username'].')';
        echo '<br><br><a href="/logout.php">Logout</a></div>';
      } else {
        echo 'Username kann nicht angezeigt werden.';
      }

db_close();
  }

In den Arrays steht nun z.B.
   Array ( [PHPSESSID] => 5808abfb4dc331aa3894592bc88268e0 ) //diese ist aber noch gleich der PHPSESSID nach dem Login
   Array ( [username] => irgendein_anderer_user)

Zum Schluss noch den Teil der logout.php

if(!isset($_SESSION["username"]))
   {
      echo "Logout nicht möglich, da du nicht eingeloggt bist.";
   }
   else{
      if(session_destroy()){
         unset($_SESSION["username"]);
         unset($_COOKIE); //Nur testweise eingefügt, da ich dachte, die SESSION wurde nicht zerstört...
         session_unset(); //ebenfalls nur testweise eingefügt
         echo "Du wurdest erfolgreich abgemeldet.";
      }
      else
      {
         echo 'Es ist ein Fehler beim Logout aufgetreten.<br>Schließe bitte aus Sicherheitsgründen dein Browserfenster.';
      }
   }

Ich hoffe, ich habe es vernünftig erklären können, sodass ihr es verstanden habt...
Falls nicht, teilt es mir bitte mit, damit ich es besser versuchen kann.

Vielen Dank für eure Hilfe

Erri

  1. Hello,

    vielelicht hast Du einen Kumpel auf dem Server, der das so ähnlich macht wie Du und dessen Sessions Du nun zufällig "erbst". Da die Provider bezüglich der Sessiondateien selten eine saubere Einrichtung haben, wäre das möglich, wenn es auch unwahrscheinlich ist. Da aber die Sessionnummern in PHP immer nach dem gelichen Schema vergeben werden, und es auf Computern auch keine echten Zufälle gibt, wäre auch ein Gleichlauf der Sessionnummern möglich.

    Allerdings vermute ich eher, dass Dein Problem hausgemacht ist. ;-))

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hi Tom,

      vielelicht hast Du einen Kumpel auf dem Server, der das so ähnlich macht wie Du und dessen Sessions Du nun zufällig "erbst". Da die Provider bezüglich der Sessiondateien selten eine saubere Einrichtung haben, wäre das möglich, wenn es auch unwahrscheinlich ist. Da aber die Sessionnummern in PHP immer nach dem gelichen Schema vergeben werden, und es auf Computern auch keine echten Zufälle gibt, wäre auch ein Gleichlauf der Sessionnummern möglich.

      Angenommen, ich "erbe" die Session eines anderen Users auf dem Server meines Providers... Warum ist beim Aufrufen einer anderen Seite aber ein User angemeldet, welcher jedoch bei mir ebenfalls in der Userdatenbank steht?

      Führe ich den Login auf meinem Homewebserver "localhoRst" aus, tritt das Problem nicht auf, allerdings bei meinem Provider... Ebenfalls habe ich es bei noch einem Provider (eines Freundes) getestet, bei dem der selbe Fehler ebenfalls auftritt.

      Gibt es noch andere Lösungen fü mein Problem?
      Ich möchte allerdings vermeiden, die PHPSESSID jedesmal an die URL anzuhängen, da dies einen enormen Aufwand bedeuten würde, die Dateien (besser gesagt die Links) umzuschreiben. Die Lösung über Hidden-Fields lässt sich auch nur sehr schwer einarbeiten.
      Außerdem, wäre bei den genannten Varianten überhaupt sicher, dass dieser Fehler nicht auftritt?

      Mich würde interessieren, wie andere PHP-User ein Login auf solche Art und Weise benutzen. ?

      Allerdings vermute ich eher, dass Dein Problem hausgemacht ist.

      Meinst du hiermit etwas Bestimmtes?

      Viele Grüße und Vielen Dank,
      Erri

      1. Hello,

        Angenommen, ich "erbe" die Session eines anderen Users auf dem Server meines Providers... Warum ist beim Aufrufen einer anderen Seite aber ein User angemeldet, welcher jedoch bei mir ebenfalls in der Userdatenbank steht?

        Ich will hier keine Panikmache betreiben, aber ich selber habe zu Demozwecken auch schon einen SessionHijacker geschrieben. Das ist ein Programm, dass daurend nach fremden Sessiondateien Ausschau hält und dann natürlich auch Manipulationen durchführen kann.

        Allerdings habe ich es nicht veröffentlicht.

        Du solltest also Deinen Session.save_path erstmal in eigenen Bereich umlegen.

        Schick mir doch mal einen Link auf deine php.ini, dann kann ich erstmal schauen, ob das überhaupt sinnvoll sit, oder ob Du lieber den Provider wechseln solltest.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Hi Tom,

          Du solltest also Deinen Session.save_path erstmal in eigenen Bereich umlegen.

          Schick mir doch mal einen Link auf deine php.ini, dann kann ich erstmal schauen, ob das überhaupt sinnvoll sit, oder ob Du lieber den Provider wechseln solltest.

          Mmh, das wäre schlecht, denn das habe ich bereits vor einer Woche schon gemacht (also den Providerwechsel)...
          Hier der Link zur phpinfo (http://web15.server3.server-www.de/selfforum.php)

          Achso, der session.save_path zeigt auf /tmp des Servers...

          Sagst du mir bescheid, wenn du geschaut hast?
          Ich möchte die Datei danach gern wieder entfernen...

          Viele Grüße und Vielen Dank,
          Erri

          1. Hello,

            Sagst du mir bescheid, wenn du geschaut hast?
            Ich möchte die Datei danach gern wieder entfernen...

            Du kannst sie beseitigen.

            Der Session.save_path müsste userbezogen geregelt werden.
            Alle anderen Werte scheinen userbezogen eingestellt zu sein.

            Harzliche Grüße aus http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            1. Hi ,

              Du kannst sie beseitigen.

              Dankeschön.

              Der Session.save_path müsste userbezogen geregelt werden.
              Alle anderen Werte scheinen userbezogen eingestellt zu sein.

              Nagut, dann werde ich mal googlen und schauen, wie ich das machen kann.
              Falls ich nichts finde, kannst du mir noch einenTipp geben, wie ich das verwirklichen kann?
              So wie ich grad denke (falls richtig - mit einer .htaccess Datei), wird bei mir nicht funktionieren, da bei meinem Provider die .htaccess-Dateien nur über Confixx erzeugt werden und ich selbst keine anlegen darf...

              Viele Grüße und Vielen Dank für deine Hilfe,
              Erri

              1. Hello,

                So wie ich grad denke (falls richtig - mit einer .htaccess Datei), wird bei mir nicht funktionieren, da bei meinem Provider die .htaccess-Dateien nur über Confixx erzeugt werden und ich selbst keine anlegen darf...

                Dann wirst Du mit Zitronen gehalndelt haben. Ich würde auch eher den Provider (freundlich) auffordern, diese letzte Einstellung auch noch abgesichert vorzunehmen. Du kannst zwar keine Systembefehle ausführen, da der Safe_Mode eingeschaltet ist und das Safe_Mode-Exec-Dir auf ein (vermutlich) leeres Verzeichnis zeigt (reime ich mir aus dem Namen zusammen), aber einen normalen Zugriff kannst Du wahrscheinlich noch schaffen. Allerdings war das session.tmp_dir nicht in open_base_dir enthalten, was durchaus noch für relative Sicherheit spricht.

                Harzliche Grüße aus http://www.annerschbarrich.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau
    2. Hi Tom,

      ich nochmal

      Allerdings vermute ich eher, dass Dein Problem hausgemacht ist. ;-))

      ich glaube eine Lösung gefunden zu haben...
      Mit deinem Hinweis, dass ich evtl. einen "Kumpel" auf dem Webserver habe, der selbige Session verwendet, hast du mich auf folgende Idee gebracht:

      Ich habe nun den Namen der Session geändert:
      ALT: $_SESSION['username'] (allerweltsname *fg*)
      NEU: $_SESSION['login_user_my_website']

      Damit funktionierts erst einmal... Mal schauen wie lange...

      Viele Grüße und Vielen Dank,
      Erri

      1. Hi Erri,

        Ich habe nun den Namen der Session geändert:
        ALT: $_SESSION['username'] (allerweltsname *fg*)
        NEU: $_SESSION['login_user_my_website']

        Ich habe mich mal vor einiger Zeit mit einem ähnlichen Fehler rumgeschlagen ;-)

        Lass raten: Auf deinem Server steht register_globals auf on, richtig?

        Folgendes Szenario:

          
        session_start();  
          
        $_SESSION['username'] = "Dennis";  
        echo $_SESSION['username'];  
        //Ausgabe: Dennis  
          
        $username = "Erri";  
        echo $_SESSION['username'];  
        //Ausgabe: Erri  
        
        

        Wegen dem register_globals ist $username als Session Variable registriert. Verwendet man nun $username irgendwo im Script, dann.....

        Mal wieder ein unschöner Nebeneffekt von register_globals ;-)

        MfG, Dennis.

        --
        Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:( mo:} zu:|
        Antworten per E-Mail gibts hier nicht!
        1. Hi ,

          Ich habe mich mal vor einiger Zeit mit einem ähnlichen Fehler rumgeschlagen ;-)

          Lass raten: Auf deinem Server steht register_globals auf on, richtig?

          Folgendes Szenario:

          session_start();

          $_SESSION['username'] = "Dennis";
          echo $_SESSION['username'];
          //Ausgabe: Dennis

          $username = "Erri";
          echo $_SESSION['username'];
          //Ausgabe: Erri

          
          > Wegen dem register\_globals ist $username als Session Variable registriert. Verwendet man nun $username irgendwo im Script, dann.....  
          >   
          > Mal wieder ein unschöner Nebeneffekt von register\_globals ;-)  
            
          Ja genau, register\_globals steht bei meinem /meinen (getesteten) Provider auf On, deswegen funktionierts da nicht... Bei meinem "localhoRst" hab ichs ausgeschalten und da funktionierts...  
            
          Provider stecken da eben bisschen in der Klemme, mit dem register\_globals... oder was meinst du?  
            
          Mmh, gut zu wissen...  
            
          Viele Grüße und Vielen Dank,  
          Erri
          
          1. Hi Erri,

            Ja genau, register_globals steht bei meinem /meinen (getesteten) Provider auf On, deswegen funktionierts da nicht... Bei meinem "localhoRst" hab ichs ausgeschalten und da funktionierts...

            Also genau das gleiche Problem wie ich es hatte - da muss man einfach aufpassen, dass man keine Session Variablen im Script verwendet ;-)

            Provider stecken da eben bisschen in der Klemme, mit dem register_globals... oder was meinst du?

            Klar, viele Scripte von Leuten laufen nur mit register_globals = on und nicht jeder kann sich seine Script selber schreiben bzw. Scripte umschreiben - und selbst Leute die es können schrecken von solchen „versauten” Scripten zurück ;-)

            Optimal fände ich natürlich, wenn ich als Kunde selber z.B. in so einem Konfigurationszentrum selber wählen könnte, ob ich register_globals on oder off haben möchte - müsste doch eigentlich auch machbar sein, oder?

            Im Zweifelsfalls gibt es aber oft immer noch Möglichkeiten, das selber auszuschalten - wenn PHP als Modul läuft, dann mittels einer .htaccess Datei, wenn PHP über CGI läuft, dann mit einer php.ini im entsprechenden Verzeichnis ;-)

            MfG, Dennis.

            --
            Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:( mo:} zu:|
            Wer die FAQ gelesen hat, ist klüger! ... und weiß wie man Links macht ;-)