Peter: Sessions

Hallo,

ich sitze gerade vor einem Internetprojekt mit PHP, MySQL und Login über Sessions. Dazu habe ich mir hier das Beispiel vom SelfHTML-Artikel ("PHP: Sessionbasiertes Loginsystem" von Benjamin Wilfing) als Vorlage genommen. Eigentlich fast 1:1, nur noch mit Anbindung an die MySQL-Datenbank erweitert. Irgendwie wird bei mir die Session-Variable $_SESSION['angemeldet'] in der Datei login.php nicht gefüllt. Keine Ahnung woran das liegen könnte. Hat wer von euch auch mit diesem Artikel und der Umsetzung solche Probleme gehabt? Ich hab jetzt den ganzen Text nochmal auf Fehler überprüft, aber nichts gefunden. Wo könnte noch ein Fehler liegen?

Über Hilfe würde ich mich freuen...

Vielen Dank
Peter

Hier der Link zu dem Artikel (falls euch das mit dem Code weiterhilft):
http://aktuell.de.selfhtml.org/artikel/php/loginsystem/
Notfalls könnte/müsste ich wohl hier noch meinen Code reinposten. Kann ich meinen PHP-Code einfach hier in den Text reinschreiben, oder muss ich das noch speziell markieren?

  1. Hi,

    solltest Du laengeren Code posten, schau doch vorher bitte mal in der Bedinungsanleitung des Forums nach. Das koennte allen helfen. :)

    1. OK, ich versuchs mal. Hier mein Code, der in der Datei login.php steht:

        
      <?php  
       if ($_SERVER['REQUEST_METHOD'] == 'POST') {  
        session_start();  
        
        $name = $_POST['name'];  
        $pwd = $_POST['pwd'];  
        
        # Verbindung zur Datenbank herstellen  
        include("inc/connect.inc.php");  
        
        $sql = "SELECT username, password, status, last_login FROM user WHERE username='" . $name . "'";  
        
        $result = mysql_query($sql)  
         or die ("Couldn't execute query!");  
        
        $row = mysql_fetch_row ($result);  
        
        if ($name == $row[0] && $pwd == $row[1]) {  
         $_SESSION['angemeldet'] = true;  
         $_SESSION['name'] = $row[0];  
         $_SESSION['status'] = $row[2];  
         $_SESSION['last_login'] = $row[3];  
        
        
         // Weiterleitung zur geschützten Seite  
         if ($_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.1') {  
          if (php_sapi_name() == 'cgi') {  
           header('Status: 303 See Other');  
           }  
          else {  
           header('HTTP/1.1 303 See Other');  
           }  
          }  
        
         header('Location: Hier steht die URL...');  
         exit;  
        
         }  
        
       }  
        
      ?>  
      
      

      Danach kommt der Formularteil in HTML in der selben Datei.

      Dann gibt es noch die Datei auth.php, die in jeder geschützten Datei als ersten eingebunden wird:

        
      <?php  
        
       session_start();  
        
       if (!isset($_SESSION['angemeldet']) || !$_SESSION['angemeldet']) {  
        header('Location: URL zum Login-Formular...');  
        exit;  
        }  
        
      ?>  
      
      

      OK, ich hoffe, dass war jetzt nicht zu viel Code und auch noch richtig in mein Posting gebastelt...

      1. Hi Peter!

        OK, ich hoffe, dass war jetzt nicht zu viel Code und auch noch richtig in mein Posting gebastelt...

        Schon ok.
        Aber du machst viele Fehler. Zunächst einmal speicherst du die Passwörter im Klartext. Wenn, wie in deinem Code, dann auch noch SQL-Injektionen möglich sind, kann jeder an die Passwörter ran.

        Hinzu kommt die Inflexibilität bei der Eingabe des Usernamens. Ich ziehe es vor, wenn auf Groß- und Kleinschreibung bei den Loginnamen verzichtet wird. Das kann in deinem Fall aber auch i.O. sein.

        Es gibt noch ein paar Fragen zu klären:
        Wie gleichst du ab, dass nicht zwei identische Usernamen vorhanden sein können?
        Du überträgst die Daten auch wirklich per POST?

        Irgendwie wird bei mir die Session-Variable $_SESSION['angemeldet'] in der Datei login.php nicht gefüllt.

        Dann wird diese Zeile wahrscheinlich nicht erfüllt sein: if ($name == $row[0] && $pwd == $row[1]) {
        Überprüfe, ob die Sessionvariable überhaupt gesetzt wird.

        MfG H☼psel

        --
        "It's amazing I won. I was running against peace, prosperity, and incumbency."
        George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
        Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
        1. Aber du machst viele Fehler.

          Ja, tut mir leid, ich beschäftige mich das erste mal mit den Sessions...

          Zunächst einmal speicherst du die Passwörter im Klartext. Wenn, wie in deinem Code, dann auch noch SQL-Injektionen möglich sind, kann jeder an die Passwörter ran.

          Hmm, schaue ich mir mal genauer an...

          Hinzu kommt die Inflexibilität bei der Eingabe des Usernamens. Ich ziehe es vor, wenn auf Groß- und Kleinschreibung bei den Loginnamen verzichtet wird. Das kann in deinem Fall aber auch i.O. sein.

          Werde ich mir nochmal durch den Kopf gehen lassen und schauen, wie ich es dann machen werde.

          Es gibt noch ein paar Fragen zu klären:
          Wie gleichst du ab, dass nicht zwei identische Usernamen vorhanden sein können?

          Noch überhaupt nicht. Ich bin da gerade erst am Anfang und habe zum testen erst mal zwei user per Hand in die Datenbank eingetragen. Das werde ich erst später umsetzen, wenn auch neue user eingetragen werden können.

          Du überträgst die Daten auch wirklich per POST?

          Ja, die Formulardaten werden per POST übertragen.

          Dann wird diese Zeile wahrscheinlich nicht erfüllt sein: if ($name == $row[0] && $pwd == $row[1]) {
          Überprüfe, ob die Sessionvariable überhaupt gesetzt wird.

          Diese Zeile hatte ich vorher (ohne Sessions) schon erfolgreich getestet. Daran lag es auch nicht. Aber mittlerweile hat sich ja mein "kleines" Anfangsproblem wohl dank Siechfred's Tipp erstmal erledigt. Es lag wohl wirklich an den Cookies. Ist mir ja ein bisschen peinlich. Ich muss mir das nochmal genauer durchlesen und dann weiter probieren.
          Vielen Dank jedenfalls für deine Hilfe.

          Peter

        2. Zunächst einmal speicherst du die Passwörter im Klartext. Wenn, wie in deinem Code, dann auch noch SQL-Injektionen möglich sind, kann jeder an die Passwörter ran.

          Hallo,
          ich hab jetzt den Code in der login.php folgendermassen abgeändert:

            
          $name = mysql_real_escape_string($_POST['name']);  
          $pwd = mysql_real_escape_string($_POST['pwd']);  
          
          

          Erst danach werden sie in einer Abfrage an die Datenbank geschickt. Das müsste doch eigentlich die SQL-Injektion verhindern, oder muss das mysql_real_escape_string direkt in der SQL-Abfrage stehen? Mit "Passwörter im Klartext" meinst du wohl, dass die Passwörter verschlüsselt in die MySQL-Datenbank eingetragen werden sollten. Schau ich mir gleich mal als nächstes an.

          Grüsse
          Peter

      2. OK, ich versuchs mal. Hier mein Code, der in der Datei login.php steht:

        Ergänzend zu Hopsel noch die Frage, wie die Session-ID weitergegeben wird. Für den Fall, dass du Cookies einsetzt: Wurden diese evtl. clientseitig geblockt?

        Siechfred

        --
        Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
        1. OK, ich versuchs mal. Hier mein Code, der in der Datei login.php steht:

          Ergänzend zu Hopsel noch die Frage, wie die Session-ID weitergegeben wird. Für den Fall, dass du Cookies einsetzt: Wurden diese evtl. clientseitig geblockt?

          Hallo, das scheint wohl das Problem gewesen sein. Ich hab von Sessions leider noch viel zu wenig Ahnung und wollte das nun mal ausprobieren. Hmm, ich werde mir das mit den Sessions und spezielll den Cookies wohl nochmal genauer durchlesen müssen. Vielen Dank jedenfalls für den Tipp.

          Peter

        2. OK, ich schein dem Problem so langsam auf der Spur zu sein.
          Es liegt wohl wirklich an der Übergabe der Session-ID bzw. der Blockade der Cookies. Ich hab mal weiter gesucht und herausgefunden, dass auch die Möglichkeit existiert, dass die Session-ID mit weitergegeben wird, wenn der Browser keine Cookies annimmt. Laut phpinfo ist session.use_trans_sid=on gesetzt. Hab auch schon gesehen, dass relative Links die PHPSESSID angehängt bekommen. Jetzt ist mein Problem nur, dass header mit der Location in meiner login.php dies wohl nicht mitschickt. Liegt vielleicht auch daran, dass die Location eine absolute URI sein muss und das mit relativen angaben nicht klappt. Keine Ahnung, kann ich das irgendwo in der phpinfo sehen, ob das funktioniert? Aber vielleicht kann mir noch wer einen kleinen Tipp geben.

          Vielen Dank. Ihr habt mir schonmal sehr viel weiter geholfen...

          Peter

          1. hi,

            Hab auch schon gesehen, dass relative Links die PHPSESSID angehängt bekommen.

            Links, die in der (Text-)Ausgabe des Scriptes stehen, ja.

            Jetzt ist mein Problem nur, dass header mit der Location in meiner login.php dies wohl nicht mitschickt.

            Der gehört ja auch nicht zur Ausgabe des Scriptes.

            Aber vielleicht kann mir noch wer einen kleinen Tipp geben.

            Hänge einfach den Parameter für die Übergabe der SID selber an.

            gruß,
            wahsaga

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
            1. Hänge einfach den Parameter für die Übergabe der SID selber an.

              OK, hab ich jetzt gemacht. Sieht auch so aus, als würde es klappen. Die PHPSESSID wird an die Location drangehängt und erscheint oben in der URL-Leiste des Browsers. "Erkennt" die nächste Seite dann automatisch die SID? Ist es jetzt eigentlich problematisch, dass ich beim Testen mehrmals Sessions gestartet habe, ohne diese explizit zu schliessen? Werden die nach bestimmter Zeit automatisch wieder vom Server gelöscht? Wurde überhaupt immer wieder eine neue Session gestartet, oder war es immer die selbe Session beim Testen, weil ich immer im gleichen Browserfenster das Login gestestet hatte?

              Vielen Dank für die Hilfe

              Peter

              1. hi,

                Die PHPSESSID wird an die Location drangehängt und erscheint oben in der URL-Leiste des Browsers. "Erkennt" die nächste Seite dann automatisch die SID?

                Das PHP-Script kann eine Session dann wieder existierenden Daten zuordnen, wenn es eine gültige Session-ID übergeben bekommen hat.

                Ist es jetzt eigentlich problematisch, dass ich beim Testen mehrmals Sessions gestartet habe, ohne diese explizit zu schliessen? Werden die nach bestimmter Zeit automatisch wieder vom Server gelöscht?

                Das liest du bitte im Manual mal selber nach.

                gruß,
                wahsaga

                --
                /voodoo.css:
                #GeorgeWBush { position:absolute; bottom:-6ft; }
                1. Das liest du bitte im Manual mal selber nach.

                  Alles klar. Werde ich machen. Vielen Dank für deine freundliche Hilfe. Bin mal wieder einen grossen Schritt vorwärts gekommen.

                  Peter

  2. hallo,

    ... habe ich mir hier das Beispiel vom SelfHTML-Artikel ("PHP: Sessionbasiertes Loginsystem" von Benjamin Wilfing) als Vorlage genommen

    Warum verlinkst du deine Vorlage nicht? Hast du die Forumshilfe nicht genau genug gelesen?

    Irgendwie wird bei mir die Session-Variable $_SESSION['angemeldet'] in der Datei login.php nicht gefüllt. Keine Ahnung woran das liegen könnte.

    Haben wir natürlich auch nicht - aber du hast den unglaublichen Vorteil, daß der Grund für dieses Problem in deinen logs genannt wird. Du hast die ja selbstverständlich nachgelesen; aber warum enthältst du sie uns nun vor?

    Hier der Link zu dem Artikel

    Ähm ... das ist kein "Link", sondern eine Zeichenfolge. Wie das mit "Links" hier im Forum geht, hast du doch in der Forumshilfe nachgelesen. Oder?

    Notfalls könnte/müsste ich wohl hier noch meinen Code reinposten.

    Nix da mit "notfalls". Das ist sogar die absolute Voraussetzung, also mach mal. Und wenn es "sehr viel" Code sein sollte, stellst du ihn eben irgendwo auf einer temporären Adresse ein und gibst dann den Link dorthin an.

    Kann ich meinen PHP-Code einfach hier in den Text reinschreiben, oder muss ich das noch speziell markieren?

    Was hast du denn an der Bedienungsanleitung zum Forum so schlecht verstanden? Gelesen hast du die ja selbstverständlich, noch bevor du überhaupt überlegt hast, ob du hier im Forum auch nur ein Zeichen schreiben solltest ...

    Grüße aus Berlin

    Christoph S.

    --
    Visitenkarte
    ss:| zu:) ls:& fo:) va:) sh:| rl:|
    1. Sorry, dass ich nicht so vorbildlich bin wie du. Aber ich lerne ja noch dazu... (Hast du schlechte Laune?)

      Peter