SESSION Problem mit Safari / Opera

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

  • SESSION Problem mit Safari / Opera

    hi,
    ich habe folgendes Problem:
    ich will mir ein auf einer Seite ein User Login - Logout bauen.
    Frage in ner DB den User ab - kann er sich identifizieren wird die SESSION Variable logged auf true gesetzt.
    Beim Ausloggen dann entsprechend auf false.
    Habe eine index.php mit langer switch abfrage - je nach case wird dann der content angezeigt.
    Klappt soweit auch - aber bei Opera und Safari habe ich denn effekt das ich nach dem auslogen geschützte Bereiche zwar nicht direkt an anwählten kann da $_SESSION['logged'] richtig abgefragt wird, beim navigieren mit dem Backbutton aber schon.
    Lasse ich mir $_SESSION['logged'] ausgeben wird beim navigieren mit dem Backbutton nach einem Ausloggen im FF und IE korrekt $_SESSION['logged'] = false angezeigt, bei Safari & Opera aber true.
    Mal einen Auzug aus dem Code:
    PHP-Code:
    session_start();
    if(!isset(
    $_SESSION['logged'])){
       
    $_SESSION['logged'] = false;
    }
    if(!isset(
    $_GET['action']))    {    
       include(
    "x_inc/start.php");
    }else if(!
    $_SESSION['logged']){
       switch(
    $_GET['action']){
         case 
    "login":    
            if(
    login()){// Datenbank Abfrage fürs einloggen
               
    $_SESSION['logged'] = true;
               
    header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']."?action=secure"true302); 
            }else{
              
    $message "Fehler beim einloggen";
              include(
    "x_inc/error.php");
            }                
            break;
         case 
    "confirmReg":// Anmeldung
           
    if(confirmReg()){// wenn user sich registrieren konnte
             
    $_SESSION['logged'] = true;
             
    $message .= "<p>bist drine</p>";
             include(
    "x_inc/secure.php");
           }else{
             
    $message "Fehler beim Registrieren";
             include(
    "x_inc/error.php");
           }
           break;
         default: include(
    "x_inc/default.php");
      }
    }else if(
    $_SESSION['logged']){
       switch(
    $_GET['action']){
         case 
    "secure":
            
    $message .= "<p>logged in</p>";
            include(
    "x_inc/secure.php");
            break;
         case 
    "logout":
            
    $_SESSION['logged'] = false;
            
    $_SESSION = array();
            
    session_destroy();
            
    header("Pragma: no-cache");
            
    header("Cache-Control: no-store, no-cache, must-revalidate");      
            
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); 
            
    header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']."?action=loggedOut"true302); 
            break;
         default: include(
    "x_inc/default.php");
      }
    // switch cascade

    Wie zerstöre ich die SESSION so das es auch Opera / Safari mitbekommen?

    Schon THX in Advance....
    "I don't want to belong to any club that would accept me as a member."

    Groucho Marx

  • #2
    PHP-Code:
    $_SESSION['logged'] = false;
    $_SESSION = array(); 
    Macht schonmal keinen Sinn, da nach dem

    PHP-Code:
    $_SESSION = array(); 
    PHP-Code:
    $_SESSION['logged'
    gar nicht mehr verfügbar ist (undefined)

    Kommentar


    • #3
      Hi Skaschy,
      hast natürlich recht, hatte $_SESSION['logged'] = false; auch nur mal reingeschrieben um sicherzugehen das beim ausloggen $_SESSION['logged'] wirklich false ist....

      Meine Frage bleibt aber: warum zeigen Safari/Opera beim navigieren mit dem Backbutton falsche werte an?
      "I don't want to belong to any club that would accept me as a member."

      Groucho Marx

      Kommentar


      • #4
        Ich habe mir deinen Code nicht angesehen, aber entweder wird das Session-Cookie in den betreffenden Browsern nicht gelöscht oder die laden die Seiten nicht vom Server sondern aus ihrem Cache. Beides lässt sich recht einfach überprüfen.

        Kommentar


        • #5
          Hi OneMoreNerd,
          lasse mir die Session Werte ausgeben - im FF werden sie gelöscht, im Safari nicht.
          Beseitige die Session beim ausloggen mit:
          $_SESSION = array();// $_SESSION leeren
          session_destroy();// Session zerstören

          und den Cache mit:
          header("Pragma: no-cache");
          header("Cache-Control: no-store, no-cache, must-revalidate");
          header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");

          Gibt es für Safari /opera sonst noch was zu beachten?

          Ach ja, in SelfHtrml gibt es ein Beispiel http://aktuell.de.selfhtml.org/artikel/php/loginsystem/, da tritt das gleiche Problem auf
          "I don't want to belong to any club that would accept me as a member."

          Groucho Marx

          Kommentar


          • #6
            Das Caching verbietest du aber nur für die Seite, wo man sich ausloggt. Die früheren Seiten sind evtl. trotzdem gecacht.

            Kommentar


            • #7
              es wird aber nur die index.php aufgerufen
              da gibt es eine switch cascade - je nach case include ich mir dann den content
              "I don't want to belong to any club that would accept me as a member."

              Groucho Marx

              Kommentar


              • #8
                Ja und nur im Logout-Case verbietest du Caching.
                Hast du mal getestet, ob die Seiten beim Zurückblättern wirklich vom Server abgerufen werden?

                Kommentar


                • #9
                  Hi,
                  seiten werden aus dem Cache geholt - Backbutton geht auch ohne Verbindung zum Server.

                  Habe den Cache Block mal ganz nach oben in die index.php gestellt - keine Veränderung
                  "I don't want to belong to any club that would accept me as a member."

                  Groucho Marx

                  Kommentar


                  • #10
                    Hast du nach dieser Änderung auch mal deinen Browsercache geleert?
                    Werden auf allen Seiten die erwarteten Header gesendet?
                    Wie sieht dein Code aktuell aus?

                    Kommentar


                    • #11
                      Erstmal: THX OneMoreNerd für deine Hilfe
                      Cache habe ich geleert
                      Hier der Antwort Header von Safaris Entwickler Tool:
                      PHP-Code:
                      Cache-Control:max-age=0post-check=0pre-check=0
                      Connection
                      :Keep-Alive
                      Content
                      -Encoding:gzip
                      Content
                      -Length:894
                      Content
                      -Type:text/htmlcharset=UTF-8
                      Date
                      :Wed05 Jan 2011 18:15:34 GMT
                      Expires
                      :-1
                      Keep
                      -Alive:timeout=1max=99
                      Last
                      -Modified:Wed05 Jan 2011 18:15:34 GMT
                      Pragma
                      :no-cacheno-cache
                      Server
                      :Apache
                      Vary
                      :Accept-Encoding
                      X
                      -Powered-By:PHP/5.2.12-nmm2 
                      meine aktuellen PHP Header ganz oben in meiner index.php:
                      PHP-Code:
                      header("Content-type: text/html; charset=UTF-8");
                      header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");    // Datum aus Vergangenheit
                      header("Expires: -1");
                      header("Last-Modified: " gmdate("D, d M Y H:i:s") . " GMT"true);   // immer ge&auml;ndert
                      header("Cache-Control: no-store, no-cache, must-revalidate"true);  // HTTP/1.1
                      header("Cache-Control: max-age=0, post-check=0, pre-check=0"true);
                      header("Pragma: no-cache"false);    // HTTP/1.0 
                      und die meta aus dem Html Bereich:
                      PHP-Code:
                      <meta http-equiv="expires" content="0" />
                      <
                      meta http-equiv="cache-control" content="no-cache" />
                      <
                      meta http-equiv="pragma" content="no-cache" /> 
                      Wie gesagt, ich kann (nach einem LogOut) mit dem Back Button zurück navigieren, wenn ich dann die Seite aktualisiere wird mir richtig angezeigt das ich ausgeloggt bin.
                      Das gilt für Safari & Opera
                      "I don't want to belong to any club that would accept me as a member."

                      Groucho Marx

                      Kommentar


                      • #12
                        Hast du gemerkt, dass es sinnlos ist, den selben Header mehrfach zu setzen?
                        Hast du getestet, ob die Header das gewünschte bewirken, die Seiten also nicht gecacht werden?

                        Kommentar


                        • #13
                          Hast du gemerkt, dass es sinnlos ist, den selben Header mehrfach zu setzen?
                          Meinst du z.B.
                          header("Pragma: no-cache", false); // HTTP/1.0
                          und
                          <meta http-equiv="pragma" content="no-cache" />
                          ?
                          Ich probiere eunfach diverse Tipps aus die im beim Googeln finde.
                          Laut PHP: header - Manual
                          Sollte das hier ja ausreichen
                          PHP-Code:
                          header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
                          header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Datum in der Vergangenheit 
                          Tut es aber (in Safari / Opera) nicht...

                          Hast du getestet, ob die Header das gewünschte bewirken, die Seiten also nicht gecacht werden?
                          In FF, IE und Chrome funktioniert der test - oder hast du noch eine andere Vorgehens weise zum Testen - Wie kann ich denn mit den Safari Entwickler Tools (oder auch Firebug) sehen ob er sich ne Seite aus dem Cache holt oder vom Server?

                          BTW:
                          Hatte auch länger nix mehr mit PHP gemacht und muß mich wieder einfuchsen
                          "I don't want to belong to any club that would accept me as a member."

                          Groucho Marx

                          Kommentar


                          • #14
                            Ich meinte eigentlich sowas:
                            PHP-Code:
                            header('Expires: ...');
                            header('Expires: ...'); 
                            Es wird nämlich nur der zuletzt gesetzte Header jeden Typs (der Typ ist der String vor dem Doppelpunkt) zum Client geschickt.
                            Und wenn du die Header mit PHP setzen kannst, brauchst du keine Meta-http-equiv-Tags mehr. Die sind mal irgendwann eingeführt worden, als Webseiten noch statische HTML-Dateien waren. Solche Tags werden vom Browser ignoriert, wenn der selbe Header als echter HTTP-Header empfangen wurde.

                            Um zu prüfen ob eine Seite aus dem Cache kommt, brauchst du nur einen Zeitstempel z.B. von time() in die Seite zu schreiben. Seite laden, Zeitstempel merken, nächste Seite laden, Sekunde warten, Back-Button klicken und Zeitstempel mit dem gemerkten vergleichen. Bei Gleichheit ist die Seite aus dem Cache gekommen.

                            Kommentar


                            • #15
                              THX,
                              da hatte ich mich mit Headern verlesen:
                              Der optionale Parameter replace gibt an, ob der Header einen vorhergehenden gleichartigen Header ersetzten soll, oder ob ein zweiter Header des selben Typs hinzugefügt werden soll. Standardmäßig wird ersetzt; wenn Sie als zweites Argument FALSE übergeben, können Sie so mehrere Header desselben Typs erzwingen. Zum Beispiel:
                              habe ich jetzt auf false gesetzt

                              Habe auch mal mit Timestamp geprüft (ich Hirnbär ):
                              bei FF und Co. werden die Seiten neu geholt - bei Safari & Opera aus dem Cache geholt

                              Html - Header habe ich rausgenommen und meine php Header sehen gerade so aus:
                              PHP-Code:
                              header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"false);    // Datum aus Vergangenheit
                              header("Expires: -1"false);
                              header("Last-Modified: " gmdate("D, d M Y H:i:s") . " GMT"true);   // immer ge&auml;ndert
                              header("Cache-Control: no-store, no-cache, must-revalidate"false);  // HTTP/1.1
                              header("Cache-Control: max-age=0, post-check=0, pre-check=0"false);
                              header("Pragma: no-cache"true);    // HTTP/1.0 
                              werde nochmal alle Kombinationen mit Safari testen....
                              THX
                              "I don't want to belong to any club that would accept me as a member."

                              Groucho Marx

                              Kommentar

                              Lädt...
                              X