Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Session wird nicht richtig beendet. System reagiert immer anders

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Session wird nicht richtig beendet. System reagiert immer anders

    Hallo,

    ich bin gerade an den SESSIONS am verzweifeln

    (aktueller Stand: siehe weiter unten.)


    Ich habe eine Startseite mit einem integrierten Formular:
    PHP-Code:
                <form action="./login/check_login.php" method="post">
                    <
    table border=0>
                        <
    tr>
                            <
    td>User:</td>
                            <
    td><input type="text" name="user"></td>
                        </
    tr>
                        <
    tr>
                            <
    td>Password:</td>
                            <
    td><input type="password" name="pass"></td>
                        </
    tr>
                        <
    tr>
                        <
    td></td>
                        <
    td><input type="submit" name="senden" value="Login"></td>
                        </
    tr>
                    </
    table>
                </
    form
    Dieses wird an folgende Datei "gesendet":
    PHP-Code:
    <?php
        session_start 
    ();
        require(
    "./../includes/db.inc.php"); 
        
        
        
        
    $benutzer $_POST[user];
        
    $password $_POST[pass]; //unverschlueselt
        
    $password1 MD5($_POST[pass]); //verschluesselt

        
        
    $adr get_Login_Data($benutzer);
            
        if(!empty(
    $password) AND (($password == $adr['password']) OR ($password1 == $adr['password'])) AND ($adr['status']) == 'enable')
            {
                 if(!isset(
    $_SESSION["loginname"]))
                     {
                         
    $_SESSION["loginname"] = $benutzer;
                         
    $_SESSION["adminrights"] = $adr['adminrights'];
                     }
                
    Header("Location: https://***/login.php");
                exit(); 
            
            }
        else{ 
            
            echo 
    "Bad Login/Password Combination OR acount is disabled!!!";

            }    
        
    mysql_close($connection);
    ?>
    Hier wird dann die Session gestartet und die Session-Variablen gesetzt. Anschließend wird die login.php Seite aufgerufen.

    Auf dieser Seite gibt es dann einen Link für den Logout:
    PHP-Code:
    <?php echo  $_SESSION["loginname"?> <a href="./login/logout.php"> Ausloggen</a>
    Den Logout habe ich wie folgt realisiert:
    PHP-Code:
    <?php 
    // Wird ausgeführt um mit der Ausgabe des Headers zu warten. 
    ob_start (); 
    session_start ();
    session_unset (); 
    session_destroy (); 

    header ("Location: ./../start.php"); 
    ob_end_flush (); 
    ?>
    Leider funktioniert das so leider alles nicht "richtig":
    1.) Wenn man nach dem Login die login.php (Durch URL-Manipulation) aufruft, dann stehen da noch die alten Session-Variablen drin?!?
    2.) Wenn man sich erneut (mit den gleichen Daten) einloggt, dann werden die Session-Variablen nicht gesetzt?!? Wenn man sich dann nochmal auslogt und dann nochmal einloggt, dann funktioniert es wieder.
    (<-- habe gerade noch mehr getestet: leider reagiert das System immer anders???!!!)

    ___
    PHP-Code:
    <?php session_start (); ?>
    steht in jeder Datei ganz oben!

    Habt ihr da eine Idee?

  • #2
    Zitat von ***tisc***
    dann werden die Session-Variablen nicht gesetzt?!?
    was meinst du damit???

    werden nicht überschrieben, ist $_SESSION nicht initialisiert? sind $_SESSION["loginname"] etc. nicht gesetzt? oder was?

    Zitat von ***tisc***
    ... dann stehen da noch die alten Session-Variablen drin
    It's not a bug, it's a feature! was du meinst ist vermutlich eine Funktion mancher Browser, dass sie die Inhalte von Formularen noch halten und automatisch wieder in die Felder einfügen, wenn man dahin zurücknavigiert.

    diese werden aber auch nur temporär gehalten und sind spätestens mit dem schließen des Browsers weg.


    thomas

    Kommentar


    • #3
      http://www.php.de/php-einsteiger/464...verwenden.html

      Kommentar


      • #4
        Habe es nochmal getestet:
        --> $_SESSION["loginname"] wird manchmal nicht gelöscht
        --> $_SESSION["loginname"] wird manchmal nicht überschrieben

        Auf der Loginseite wird $_SESSION["loginname"] ausgeben:
        Diese Ausgabe ist manchmal leer.
        Manchmal werden die Daten vom vorherigen User ausgegeben, obwohl ich mich mit einem anderen Namen angemeldet habe.

        Es kann doch nicht sein, dass das System macht, "was es möchte".

        Kommentar


        • #5
          Zitat von ***tisc*** Beitrag anzeigen
          PHP-Code:
                       if(!isset($_SESSION["loginname"]))
                           {
                               
          $_SESSION["loginname"] = $benutzer;
                               
          $_SESSION["adminrights"] = $adr['adminrights'];
                           } 
          Na verhinderst denn Du hier nicht, dass die Sitzung überschrieben wird wenn schon eine vorhanden ist?

          Kommentar


          • #6
            Habe es geändert (hatte ich vorher auch schon ohne dem inneren If-Zweig).

            Momentan muss ich mich dreimal hintereinander einloggen, so dass es funktioniert...

            Wie wichtig ist die Groß- udn Kleinschreibung bei:
            ich habe: $_SESSION und session_start();
            Momentan habe ich auch das Gefühl, dass für $_SESSION["loginname"] mehrere Werte hinterlegt sind (nach mehrmaligem Einloggen).

            Nur noch mal zur Klarstellung: $_SESSION["loginname"] soll und darf nur einmal pro Login existieren!!! Beim Logout soll $_SESSION["loginname"] gelöscht werden!

            Kommentar


            • #7
              Wie wichtig ist die Groß- udn Kleinschreibung
              Variablennamen sind Case-sensitiv und Array-indizes auch! also recht wichtig, wenns funktionieren soll.
              $_SESSION["loginname"], $_Session["loginname"] und $_SESSION["LoginName"] sind drei unterschiedliche Variablen

              Nur noch mal zur Klarstellung: $_SESSION["loginname"] soll und darf nur einmal pro Login existieren!!!
              dafür sorgt PHP von alleine. jede Variable kann in ihrem Kontext nur einen Wert gleichzeitig haben, auch wenn dieser "Wert" ein array mit mehreren Werten darin sein kann.
              Keine Variable kann gleichzeitig unterschiedliche Werte haben!!!

              ich würde in der check_login.php noch sowas vorschlagen
              PHP-Code:
              <?php
              session_start
              ();
              if( 
              $_SESSION['loginname'] ){
                  
              header("Location: wohin_auch_immer.php"); 
                  exit();
              }
              ...

              Kommentar


              • #8
                Hallo,

                leider immer noch keine Besserung!

                Um noch mal "Ordnung" reinzubringen. Hier mal der aktuelle Zwischenstand und der Ablauf der php-Seiten:

                Also ich habe eine Startseite (start.php)mit einem integriertem Formular für eine Anmeldung:
                PHP-Code:
                    <td align=center>  
                        

                            <
                form action="./login/check_login.php" method="post">
                                <
                table border=0>
                                    <
                tr>
                                        <
                td>User:</td>
                                        <
                td><input type="text" name="user"></td>
                                    </
                tr>
                                    <
                tr>
                                        <
                td>Password:</td>
                                        <
                td><input type="password" name="pass"></td>
                                    </
                tr>
                                    <
                tr>
                                    <
                td></td>
                                    <
                td><input type="submit" name="senden" value="Login"></td>
                                    </
                tr>
                                </
                table>
                            </
                form>

                    </
                td
                (auf der Seite ist kein "session_start();" oben)

                Die Eingabe wird in folgender Datei überprüft:
                PHP-Code:
                <?php
                    session_start
                ();
                    require(
                "./../includes/db.inc.php"); 
                    
                    
                    
                    
                $benutzer $_POST[user];
                    
                $password $_POST[pass]; //unverschlueselt
                    
                $password1 MD5($_POST[pass]); //verschluesselt

                    
                    
                $adr get_Login_Data($benutzer);
                        
                    if(!empty(
                $password) AND (($password == $adr['password']) OR ($password1 == $adr['password'])) AND ($adr['status']) == 'enable')
                        {
                                
                                if(
                $_SESSION['loginname'])
                                    {
                                        
                $_SESSION['loginname'] = $benutzer;
                                         
                $_SESSION['adminrights'] = $adr['adminrights'];
                                    }    
                                        
                Header("Location: https://www.***/login.php");
                                        exit(); 
                        
                        }
                    else{ 
                        
                        echo 
                "Bad Login/Password Combination OR acount is disabled!!!";

                        }    
                    
                mysql_close($connection);
                ?>
                Die login.php sieht genauso wie die start.php aus. Jedoch gibt es hier nicht mehr das Eingabeformuular für die Anmeldung, sondern es erscheint ein Link für die Abmeldung. Vor dem Link soll immer der aktuelle User stehen:
                PHP-Code:
                <?php session_start(); ?>


                <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//DE"
                "http://www.w3.org/TR/html4/loose.dtd">
                <html>
                <head>

                ...

                    <td align=center>  
                        

                            <?php 
                                $temp 
                $_SESSION['loginname'];
                                echo  
                $temp.": " ?> <a href="./login/logout.php"> Ausloggen</a> 

                    </td>
                Dann gibt es noch eine weitere Datei (check_session.php), für folgende Seiten:
                PHP-Code:
                <?php session_start(); 
                if (!isset(
                $_SESSION['loginname'])) 

                  
                header ("Location: https://***/start.php"); 

                ?>
                (müsste ich diese Datei auch schon bei der login.php einbinden? (Habe es schonmal versucht, aber es funktioniert wegen dem Header nicht..)

                Die logout.php sieht so aus:
                PHP-Code:
                <?php 
                // Wird ausgeführt um mit der Ausgabe des Headers zu warten. 

                ob_start(); 
                session_start();
                session_unset(); 
                session_destroy();

                header ("Location: ./../start.php"); 
                ob_end_flush(); 
                ?>
                Mein erstes Problem (im Browser sind alles Cookies und Cache geleert):
                1.) Wenn ich mich erfolgreich einlogge, dann werde ich auf die login.php weitergeleitet, jedoch wird nicht der User ausgegeben. Klicke ich auf einen weiteren Link (der nur für angemeldetet User sichtbar ist), dann werde ich wieder zur start.php zurückgeleitet. D.h. meine Session-Variable wurde nicht gesetzt?!?
                (Wenn ich mich mehrmals angemeldet habe, dann funktioniert es irgendwann) - irgendwie ist da eine zeitliche Verzögerung?!?

                - Wo könnte der Fehler noch liegen?

                Kommentar


                • #9
                  - Muss man eine SessionID weiterübergeben - das ist ja hier bei mir noch nicht der Fall...?

                  Jetzt lasse ich mir die Session-ID immer ausgeben:
                  Sie wird nach dem Login vergeben und nach dem Logout wieder gelöscht. Bei einem neunen Login, hat die ID wieder die gleiche "Nummer".

                  Ist das schlimm? Könnte es daran liegen?

                  Kommentar


                  • #10
                    Wenn ich mich erfolgreich einlogge, dann werde ich auf die login.php weitergeleitet, jedoch wird nicht der User ausgegeben.
                    stimmt, weil in $_SESSION['loginname'] nichts drinsteht!
                    Klicke ich auf einen weiteren Link (der nur für angemeldetet User sichtbar ist), dann werde ich wieder zur start.php zurückgeleitet
                    ist ja auch so gewollt, wenn man nicht angemeldet ist. könnte genau so gut URL-manipulation sein.
                    (Wenn ich mich mehrmals angemeldet habe, dann funktioniert es irgendwann)
                    das hingegen wundert mich.

                    hier mal das überarbeitete Script für die check_login.php
                    PHP-Code:
                    <?php
                    session_start
                    ();
                    /* 
                        du bist bereits angemeldet, 
                        du kannst dich nicht erneut anmelden bevor du dich nicht abgemeldet hast
                        und in dem Fall muss auch nicht überprüft werden ob die Zugangsdaten 
                        gültig sind
                    */
                    if( $_SESSION['loginname'] ){
                        
                    header("Location: https://bitte_korrekten_pfad_ergänzen/login.php");
                        exit();
                    }

                    require_once(
                    "./../includes/db.inc.php"); 
                        
                    $adr get_Login_Data($_POST['user']);
                    mysql_close($connection);

                    if( 
                    $adr['status']=='enable' 
                        
                    AND(   $adr['password']==$_POST['pass'
                            OR 
                    $adr['password']==md5($_POST['pass']
                        )
                    ){
                    /* 
                        du darfst dich anmelden und die Zugangsdaten sind gültig,
                        hier muss nichts mehr überprüft werden
                    */
                        
                    $_SESSION['loginname'] = $_POST['user'];
                        
                    $_SESSION['adminrights'] = $adr['adminrights'];
                        
                        
                    header("Location: https://bitte_korrekten_pfad_ergänzen/login.php");
                        exit(); 
                    } else { 
                        echo 
                    "Bad Login/Password Combination OR acount is disabled!!!";
                    }
                    ?>
                    noch ein paar Anmerkungen zu deinem code.
                    PHP-Code:
                    $benutzer $_POST[user];
                    $password $_POST[pass]; 
                    sowas seh ich leider immer wieder; wozu die Daten aus einer Variable in die andere kopieren???

                    die überprüfung auf empty($_POST['pass']) kannst du dir sparen, weil entweder ist '' ein gültiges passwort,
                    oder es ist bei der Registrierung bereits was schiefgegangen

                    ich vermute $adr['status'] regelt sowas wie "Benutzer ist registriert, aber darf momentan nicht rein"
                    dann ergänz das doch besser das innerhalb des SQL-querys und gib nur dann einen Datensatz aus, wenn alles korrekt ist.
                    das selbe gilt fürs Passwort

                    etwas in der art von:
                    PHP-Code:
                    $pass md5($pass);
                    $query="SELECT * FROM tabellenname WHERE user='$user' AND password='$pass' AND status='enabled'"
                    und meldest dich an mit:
                    PHP-Code:
                    if( ($adr=get_Login_Data($_POST['user'])) ) 
                    /* anmelden */ 
                    else
                    /* nicht */ 
                    und wieso überprüfst du das PW in klartext und verschlüsselt?
                    es sollten keine klartext-passwörter in der datenbank stehen!!!
                    genausowenig wie jemand ein verschlüsseltes Passwort eingeben sollte.

                    Kommentar


                    • #11
                      So ich habe mal ein paar Sachen (Schönheitsreparaturen) geändert. genützt hat es leider nichts.
                      check_login.php:
                      PHP-Code:
                      <?php
                          session_start
                      ();
                          


                          
                          if( 
                      $_SESSION['sloginname'] )
                          {
                              
                      header("Location: https://www.***/login.php");
                              exit();
                          }

                          require(
                      "./../includes/db.inc.php");     
                              
                          if(
                      $adr get_Login_Data($_POST['user'], MD5($_POST['pass'])))
                              {

                                              
                      $_SESSION["sloginname"] = $_POST['user'];
                                               
                      $_SESSION["sadminrights"] = $adr['adminrights'];
                                              
                      mysql_close($connection);
                                              
                      Header("Location: https://www.***/login.php");
                                              exit();
                              
                              }
                          else{ 
                              
                              echo 
                      "Bad Login/Password Combination OR acount is disabled!!!";
                              
                      mysql_close($connection);
                              

                              }    
                          
                      ?>
                      @thomasE:
                      1.)
                      stimmt, weil in $_SESSION['loginname'] nichts drinsteht!
                      Da sollte aber was drin stehen! Von der start.php geht es zur check_login.php, dort werden die Logindaten überprüft. Wenn sie korrekt sind (und nur dann!!!) wird man auf die login.php weitergeleitet! Wenn ich dann dort die $_SESSION['loginname'] ausgebe, dann muss sie zuvor schon in der check_login.php gesetzt worden sein!

                      2.)
                      ist ja auch so gewollt, wenn man nicht angemeldet ist. könnte genau so gut URL-manipulation sein.
                      Der Link erscheint auf der login.php, d.h. man hat sich erfolgreich eingeloggt (Session-variablen müssten gesetzt sein!). Wenn ich also auf den Link klicke, dann sollte er auch funktionierten und mich nicht wieder zum Start befördern (Auf allen weiteren Seiten wird dann die check_session.php eingebunden)

                      3.)
                      das hingegen wundert mich.
                      Momentan ist es tatsächlich so, das ich die Login-Daten zwei, drei Mal hintereinander eingeben muss, bis ich dann tatsächlich eingeloggt bin.

                      Deine Vorschläge zu den Schönheitsreparaturen habe ich soweit alles umgesetzt. Danke für die Tipps!

                      Kommentar


                      • #12
                        Du hast jetzt ja da den Namen geändert. Kannst du evtl. nochmal die vollständigen drei Dateien posten, die du in dem Eingangspost gepostet hast? Und evtl. schaust du mal auf jeder Seite, was in dem Session-Array steht. Dann könnte man sehen, ab wann eben nichts mehr steht. Gibt es irgendwelche PHP-Fehler wie E_NOTICE? Schau dir mal den Log dazu an.
                        Gruß

                        Kommentar


                        • #13
                          Hier der aktuelle Stand der wichtigen php-Dateien:

                          1.)start.php:
                          PHP-Code:
                              <td align=center>  
                                  

                                      <
                          form action="./login/check_login.php" method="post">
                                          <
                          table border=0>
                                              <
                          tr>
                                                  <
                          td>User:</td>
                                                  <
                          td><input type="text" name="user"></td>
                                              </
                          tr>
                                              <
                          tr>
                                                  <
                          td>Password:</td>
                                                  <
                          td><input type="password" name="pass"></td>
                                              </
                          tr>
                                              <
                          tr>
                                              <
                          td></td>
                                              <
                          td><input type="submit" name="senden" value="Login"></td>
                                              </
                          tr>
                                          </
                          table>
                                      </
                          form>
                              </
                          td
                          2.) check_login.php:
                          PHP-Code:
                          <?php
                              session_start
                          ();
                              


                              
                              if( 
                          $_SESSION['sloginname'] )
                              {
                                  
                          header("Location: https://***/login.php");
                                  exit();
                              }

                              require(
                          "./../includes/db.inc.php");     
                                  
                              if(
                          $adr get_Login_Data($_POST['user'], MD5($_POST['pass'])))
                                  {
                                          
                                                  
                          $_SESSION["sloginname"] = $_POST['user'];
                                                   
                          $_SESSION["sadminrights"] = $adr['adminrights'];
                                                  
                          mysql_close($connection);
                                                  
                          Header("Location: https://www.***/login.php");
                                                  exit();
                                  
                                  }
                              else{ 
                                  
                                  echo 
                          "Bad Login/Password Combination OR acount is disabled!!!";
                                  
                          mysql_close($connection);
                                  

                                  }    
                              
                          ?>
                          3.) login.php:
                          PHP-Code:
                          <?php session_start(); ?>
                          <?php 
                          include ("./login/check_session.php");  ?>
                          ...
                              <td align=center>  
                                  

                                      <?php 
                                          $temp 
                          $_SESSION["sloginname"];
                                          echo  
                          $temp.": " ?> <a href="./login/logout.php"> Ausloggen</a>
                                      <?php     echo 'Session-ID: '.session_id(); ?>

                              </td>
                          4.) logout.php:
                          PHP-Code:
                          <?php 
                          // Wird ausgeführt um mit der Ausgabe des Headers zu warten. 

                          ob_start(); 
                          session_start();
                          session_unset(); 
                          session_destroy();

                          header ("Location: ./../start.php"); 
                          ob_end_flush(); 
                          ?>

                          Kommentar


                          • #14
                            Und wenn du die Login.php aufrufst, sagt check_session, dass die Session abgelaufen ist?
                            Mach mal "var_dump($_SESSION);" in der login.php nach dem session_start. Dann wird das Script zwar abbrechen, weil der Header ja bereits gesendet wurde, aber dann kannst du sehen, ob überhaupt was in dem Array steht.
                            Gruß

                            Kommentar


                            • #15
                              Ausgabe: array(0) { }
                              (<-- steht nichts drin?!?)
                              SESSION_ID wurde aber vergeben... (die lasse ich mir auch ausgeben)

                              Dennoch werde ich auf die login.php weitergeleitet! Wenn ich dann da auf ausloggen gehe und mich noch mal einlogge, dann steht da:
                              array(2) { ["sloginname"]=> string(3) "asd" ["sadminrights"]=> string(5) "Admin" }

                              Dann logge ich mich wieder aus und logge mich mit einem anderen user2 ein:
                              Ausgabe: array(0) { }

                              Dann logge ich mich wieder aus und logge mich ernuet mit user2 ein:
                              Ausgabe: array(0) { }

                              Dann logge ich mich wieder aus und logge mich ernuet mit user ein:
                              array(2) { ["sloginname"]=> string(3) "qwe" ["sadminrights"]=> string(4) "User" } (<-- das sind aber die Daten von User2!!! Mit der Login eben nicht funktioniert hat)
                              ....

                              Dennoch werde ich auf die login.php weitergeleitet! Wenn ich dann da auf ausloggen gehe und mich noch mal einlogge, dann steht da:
                              array(2) { ["sloginname"]=> string(3) "asd" ["sadminrights"]=> string(5) "Admin" }

                              Kommentar

                              Lädt...
                              X