hawkmaster: Cookie gelöscht, Daten trotzdem da?

Hallo zusammen,

Ich versuche gerade eine "RememberMe" Funktion mit Cookies einzubauen.
wenn man in einer Php Seite (Formular) auf Logout klickt, lösche ich unter anderem
auch das Cookie:

  
if(isset($_GET['LogOut'])){  
   setcookie ("rememberMe", "", time() - 3600);  
  setcookie ("rememberMeToken", "", time() - 3600);  
}  

Kurz danach kommt dann die Prüfung ob es ein Cookie mit RememberMe gibt, wenn nicht soll der Login Screen kommen:

  
..  
$userId = base64_decode($_COOKIE["rememberMe"]);  
$userData = get_username($userId);  
$salt = "ccc";  
	  
$hash = md5($salt."|".$userData['userid']."|".substr($userData['password'], 0, 5));  
	  
echo "der user mit der id $userId und dem hash $hash <br>";  
if($hash == $_COOKIE["rememberMeToken"]){  
//wenn ok einloggen  
echo "rememberme token ist ok <br>";  
}  
else{  
  //zum login  
}  
..  

Obwohl das Cookie gelöscht wird (kontrolliert im Firebug), zeigt die echo Ausgabe weiter unten immer noch die richtigen Cookie Daten an und auch die Meldung "rememberme token ist ok".

Ich dachte erst es wäre vielleicht ein Zeit Problem, dass das PHP Script schneller ist als das löschen des Cookies? Aber auch ein Versuch mit "sleep()" nach dem löschen brachte keine Veränderung.
Hat jemand eine Idee?

vielen Dank und viele Grüße
hawk

  1. Hi,

    Ich versuche gerade eine "RememberMe" Funktion mit Cookies einzubauen.

    und verzettelst dich dabei im zeitlich-logischen Ablauf der Cookie-Operationen.

    wenn man in einer Php Seite (Formular) auf Logout klickt, lösche ich unter anderem
    auch das Cookie:

    if(isset($_GET['LogOut'])){

    setcookie ("rememberMe", "", time() - 3600);
      setcookie ("rememberMeToken", "", time() - 3600);
    }

      
    In diesem Moment wird noch nichts gelöscht, nur ein HTTP-Header vorgemerkt, der mit der Ausgabe des laufenden Scripts an den Client gesendet wird. Erst beim \_nächsten\_ Request kannst du die Veränderung auch serverseitig sehen.  
      
    
    > Kurz danach kommt dann die Prüfung ob es ein Cookie mit RememberMe gibt, wenn nicht soll der Login Screen kommen:  
      
    Und wenn das noch im selben Script, im selben Request passiert, dann ist das Cookie aus dem Request noch da.  
      
    
    > Obwohl das Cookie gelöscht wird (kontrolliert im Firebug), ...  
      
    Clientseitig ja: Wenn der Browser die Server-Antwort bekommt, wertet er auch die Header aus und kümmert sich beispielsweise um das Cookie-Gedöns.  
      
    
    > ... zeigt die echo Ausgabe weiter unten immer noch die richtigen Cookie Daten an und auch die Meldung "rememberme token ist ok".  
      
    Ja, diese Ausgabe wurde aus dem vorherigen Request erzeugt, als das Cookie noch gesetzt war.  
      
    Es gibt mehrere Möglichkeiten, aus dieser Zwickmühle auszubrechen. Eine ist, mit dem setcookie()-Aufruf auch gleichzeitig das Cookie aus $\_COOKIE zu löschen. Eine andere, weniger schöne ist ein Redirect, mit dem man dem Client einmalig ein Neuladen der Ressource nahelegt.  
      
    So long,  
     Martin  
    
    -- 
    Ist die Katze gesund,  
    freut sich der Hund.  
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    
    1. Hallo Martin,

      danke dir für die Hilfe.
      Ja ich habe auch festgestellt wenn man mit F5 einen Browser Refresh macht, geht es dann wie gewünscht.
      Ich habe mich vermutlich täuschen lassen, dass im Firebug das Cookie sofort weg war. Aber ja klar, auf dem Server passiert das ja erst beim nächsten Request.

      Es gibt mehrere Möglichkeiten, aus dieser Zwickmühle auszubrechen. Eine ist, mit dem setcookie()-Aufruf auch gleichzeitig das Cookie aus $_COOKIE zu löschen. Eine andere, weniger schöne ist ein Redirect, mit dem man dem Client einmalig ein Neuladen der Ressource nahelegt.

      Wie meinst du das mit dem "..Eine ist, mit dem setcookie()-Aufruf auch gleichzeitig das Cookie aus $_COOKIE zu löschen"??

      vielen Dank und viele Grüße
      hawk

      1. Hallo,

        ok ich glaube du meintest vermutlich das Cookie mit

        unset($_COOKIE['rememberMe']);

        zu löschen ..

        So geht es dann auch :-)

        vielen Dank und viele Grüße
        hawk

  2. Hallo,

    auf manchen Webseiten, z.B. online-banking, werde ich darauf hingewiesen, dass Cookies aktiv sein müssen (sind bei mir stanfardmäßig ausgeschaltet).

    Wie kann ein Server beim ersten Aufruf feststellen, dass Cookies verboten sind?

    Linuchs

    1. Tach!

      auf manchen Webseiten, z.B. online-banking, werde ich darauf hingewiesen, dass Cookies aktiv sein müssen (sind bei mir stanfardmäßig ausgeschaltet).
      Wie kann ein Server beim ersten Aufruf feststellen, dass Cookies verboten sind?

      Bist du sicher, dass es sich dabei nur um einen einzelnen Request (abgesehen von Bildern) gehandelt hat? Der Browser sagt dem Webserver dazu jedenfalls nichts. Es ist nur bei einem zweiten Request kein Cookie dabeigewesen, also nimmt man an, dass keine Cookies erlaubt sind.

      dedlfix.

    2. Hallo,

      auf manchen Webseiten, z.B. online-banking, werde ich darauf hingewiesen, dass Cookies aktiv sein müssen (sind bei mir stanfardmäßig ausgeschaltet).

      Wie kann ein Server beim ersten Aufruf feststellen, dass Cookies verboten sind?

      Es braucht immer zwei Requests, wie dedlfix bereits schrieb. Für den Besucher nicht gleich sichtbar, dass es zwei Requests sind, ermöglicht Ajax:

      1. Request: Die Seite wird angefordert und ausgeliefert. Ein in die Seite eingebautes JavaScript befragt document.cookie und schickt das Ergebnis per XHR (Ajax) zurück zum Server (2. Request).

      Die zum 2. Request gehörige Response wird in das Dokument gerendert, welches beim 1. Request ausgeliefert wurde (immer noch diesselbe Seite).

      PS: Heute neue Krimiserie aus Prvz. Bozen, guckst Du...

      Vieleicht spielt sogar der Dolomiten Schnauzer mit, der "Hausmeister von Südtirol", eine beliebte Karrikatur der lokalen Presse.

      1. Hallo

        auf manchen Webseiten, z.B. online-banking, werde ich darauf hingewiesen, dass Cookies aktiv sein müssen (sind bei mir stanfardmäßig ausgeschaltet).

        Wie kann ein Server beim ersten Aufruf feststellen, dass Cookies verboten sind?

        Es braucht immer zwei Requests, wie dedlfix bereits schrieb. Für den Besucher nicht gleich sichtbar, dass es zwei Requests sind, ermöglicht Ajax:

        Geht auch mit ohne Ajax. Erstes Skript: Cookie setzen, dann Weiterleitung per Header und im zweiten Skript abfragen, ob das Cookie vorhanden ist.

        Nur, um einen weiteren Weg dokumentiert zu haben.

        Tschö, Auge

        --
        Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
        Terry Pratchett, "Wachen! Wachen!"
        ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
        1. hi,

          Es braucht immer zwei Requests, wie dedlfix bereits schrieb. Für den Besucher nicht gleich sichtbar, dass es zwei Requests sind, ermöglicht Ajax:

          Geht auch mit ohne Ajax. Erstes Skript: Cookie setzen, dann Weiterleitung per Header und im zweiten Skript abfragen, ob das Cookie vorhanden ist.

          Nur, um einen weiteren Weg dokumentiert zu haben.

          Ja, schön ;)

          Aber warum zwei Skript's?

          Schöne Grüße ;)

          1. Hallo

            Es braucht immer zwei Requests, wie dedlfix bereits schrieb. Für den Besucher nicht gleich sichtbar, dass es zwei Requests sind, ermöglicht Ajax:

            Geht auch mit ohne Ajax. Erstes Skript: Cookie setzen, dann Weiterleitung per Header und im zweiten Skript abfragen, ob das Cookie vorhanden ist.

            Nur, um einen weiteren Weg dokumentiert zu haben.

            Ja, schön ;)

            Aber warum zwei Skript's?

            Ich verstehe die Frage nicht.

            Tschö, Auge

            --
            Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
            Terry Pratchett, "Wachen! Wachen!"
            ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
            1. Hallo

              Es braucht immer zwei Requests, wie dedlfix bereits schrieb. Für den Besucher nicht gleich sichtbar, dass es zwei Requests sind, ermöglicht Ajax:

              Geht auch mit ohne Ajax. Erstes Skript: Cookie setzen, dann Weiterleitung per Header und im zweiten Skript abfragen, ob das Cookie vorhanden ist.

              Nur, um einen weiteren Weg dokumentiert zu haben.

              Ja, schön ;)

              Aber warum zwei Skript's?

              Ich verstehe die Frage nicht.

              Sie zielt darauf ab, das Senden eines Set-Cookie-Headers und die Abfrage ob er zurückkommt, in einem Skript zu machen (egal ob mit oder mit ohne Ajax).

              Schöne Grüße.

              1. Hallo

                Es braucht immer zwei Requests, wie dedlfix bereits schrieb. Für den Besucher nicht gleich sichtbar, dass es zwei Requests sind, ermöglicht Ajax:

                Geht auch mit ohne Ajax. Erstes Skript: Cookie setzen, dann Weiterleitung per Header und im zweiten Skript abfragen, ob das Cookie vorhanden ist.

                Nur, um einen weiteren Weg dokumentiert zu haben.

                Ja, schön ;)

                Aber warum zwei Skript's?

                Ich verstehe die Frage nicht.

                Sie zielt darauf ab, das Senden eines Set-Cookie-Headers und die Abfrage ob er zurückkommt, in einem Skript zu machen (egal ob mit oder mit ohne Ajax).

                Herrje, dann ersetze „Skript“ mit „Request“. Is Freitach, ne?

                Tschö, Auge

                --
                Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
                Terry Pratchett, "Wachen! Wachen!"
                ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
                1. hi,

                  Herrje, dann ersetze „Skript“ mit „Request“. Is Freitach, ne?

                  Annäähh ;)
                  Da wäre ich nie draufgekommen, echt krasser Tippfehler ;)

                  Feilich is Freidach ;)

                  Schänw Frwizack!

                  Horst