Linuchs: PHP: Cookie wird nicht gelöscht

Moin,

ich lasse die Cookies von PHP anzeigen:

  echo "<pre>";
  var_dump( $_COOKIE );
  echo "</pre>";

Ausgabe:

array(10) {
  ["p000"]=>
  string(17) "Cookies zulaessig"
  ["VIP"]=>
  string(14) "901@1530190025"
  ["p101"]=>
  string(17) "100@@havel@     S"
  ["my_VIP"]=>
  string(1) "0"
  ["p001"]=>
  string(16) "Kalle@1516023742"
  ["email_s"]=>
  string(17) "osmer.kh@osmer.de"
  ["p106"]=>
  string(11) "25@@@havel@"
  ["my_ORT"]=>
  string(5) "13568"
  ["my_TYP"]=>
  string(1) "7"
  ["p108"]=>
  string(21) "..........@.....S...."
}

Nun möchte ich das Cookie my_VIP loswerden und mache das nach Vorschrift:

// Setzen des Verfalls-Zeitpunktes auf 1 Stunde in der Vergangenheit
setcookie("my_VIP", "", time() - 3600);

auch dieses kommt nicht zum Erfolg:

Doch beim nächsten Aufruf der Seite ist es immer noch da. Ich habe es mit Javascript gesetzt und vermute irgend eine mir nicht zugängliche Information. Wie wäre es, wenn Javascript das Cookie für einen bestimmten Ordner gesetzt hätte?

"Cookies müssen mit den selben Parametern gelöscht werden, mit denen sie gesetzt wurden." - eben, die hätte ich gerne.

Gesetzt habe ich das Cookie mit JS:

// cname = my_VIP / cvalue = 0
function setCookie( cname, cvalue ) {
    if ( cvalue == "loeschen" || cvalue < " " ) {
//    document.cookie = cname + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;';
      document.cookie = cname + "=''; max-age=0; path=/; domain=remso.eu"
      alert ( "Cookie " + cname + " gelöscht" );
    } else {
      var d = new Date();
      d.setTime(d.getTime() + (90*24*60*60*1000)); // 90 Tage aufbewahren
      var expires = "expires="+d.toUTCString();
      var cookie_string = cname + "=" + cvalue + "; " + expires + "; path=/;" + " domain=remso.eu; ";
      document.cookie   = cookie_string;
      alert ( "[" + cookie_string + "]" );
    }
    if ( typeof document.getElementById( "buchungstext" ) !== "undefined" ) document.getElementById( "buchungstext" ).style.visibility = "hidden";
  }

Oder ist das Ganze eine MAcke vom Firefox 61.0 - dort kann ich die Cookies nicht mehr anzeigen lassen.

Gruß, Linuchs

  1. Hallo Linuchs,

    Nun möchte ich das Cookie my_VIP loswerden und mache das nach Vorschrift:

    na ja, nach Vorschrift…

    Letztendlich hast du hier ein Array und kannst das auch so behandeln. Hast du mal testweise versucht alle zu löschen? session_destroy() und weitere Infos.

    Gruss
    Henry

    --
    Meine Meinung zu DSGVO & Co:
    „Principiis obsta. Sero medicina parata, cum mala per longas convaluere moras.“
  2. Ich habe es mit Javascript gesetzt

    Hm. Dann lösche es auch so.

    Wie wäre es, wenn Javascript das Cookie für einen bestimmten Ordner gesetzt hätte?

    Dann würde der Browser es bei einem Request außerhalb dieses Ordners nicht an den Server senden. Du könntest es also nicht sehen.

    Ich bin mir aber nicht sicher ob Du es außerhalb des Ordners oder in einem Unterordner des ursprünglichen Skriptes "befindlich" löschen kannst.

    eine MAcke vom Firefox 61.0 - dort kann ich die Cookies nicht mehr anzeigen lassen.

    Gottogott. Hattenwirgrade

    1. Die Anwendung: Der Leser meines Kalenders soll per JS Lesezeichen als Cookie setzen, die von PHP verstanden und mit Daten beantwortet werden. Möglichst für www.remso.eu und remso.eu

      Cookie my_ORT=4711 soll den gewünschten Ortskalender, my_VIP=606 einen Mitglieds-Kalender zeigen usw.

      Seit Monaten klappt das nur zufällig und bei jeder Programmänderung haut wieder was nicht hin. Der Grund: Die Dokumentation von Cookies ist miserabel. Im FF 59.0.2 sehe ich, dass manche die Bemerkung Domain: .remso.eu haben, andere Host: remso.eu

      In keiner Doku lese ich, dass man sowohl als auch setzen kann, da geht es immer nur um ein einziges Cookie im ganzen System, was auch immer System sein mag. Unklar.

      Diese Info Domain/Host scheint weder JS noch PHP zugänglich zu sein (ebensowenig wie das Verfalldatum), und beim Lesen wird gewürfelt. Wird das erste oder letzte oder noch ein anderes genommen? Ich setze mit JS ein (weiteres) Cookie, der FF zeigt es an, aber PHP kennt den Inhalt nicht. Wahnsinn.

      alert(document.cookie);
      

      p000=/css/; p000=domain:remso.eu/_text/; p000=/; p000=domain:remso.eu/

      Vier Cookies mit demselben Namen. Ich habe aber versucht, sechs zu setzen. FF 59 zeigt fünf an:

            Inhalt                  Bemerkung
      ----- ----------------------- ---------------------
      FF 1. /css/                   Host: www.remso.eu
      FF 2. /                       Host: www.remso.eu
      FF 3. domain:remso.eu/_text/  Domain: .remso.eu
      FF 4. domain:remso.eu/css/    Domain: .remso.eu
      FF 5. domain:remso.eu/        Domain: .remso.eu
      

      Mit der Seite cookies.php habe ich im Browser gesetzt:

      alert( "cookie_key=["+cookie_key+"] GMT=["+GMT+"]" );
      
      // Cookie fuer eigenes Verzeichnis /_text/ des Dokuments remso.eu/_text/cookies.htm ?
      value = "/_text/";
      document.cookie = cookie_key + "=" + value + ";expires="+ GMT +";";
      
      // Cookie fuer fremdes Verzeichnis /css/ des Dokuments remso.eu/_text/cookies.htm ?
      value = "/css/";
      document.cookie = cookie_key + "=" + value + ";expires="+ GMT +";";
      
      // Cookie fuer Hauptverzeichnis / des Dokuments remso.eu/_text/cookies.htm ?
      value = "/";
      document.cookie = cookie_key + "=" + value + ";expires="+ GMT + "; path=/;";
      
      
      // Cookie fuer eigenes Verzeichnis /_text/ des Dokuments remso.eu/_text/cookies.htm fuer domain ?
      value = "domain:remso.eu/_text/";
      document.cookie = cookie_key + "=" + value + ";expires="+ GMT +";domain=remso.eu;";
      
      // Cookie fuer fremdes Verzeichnis /css/ des Dokuments remso.eu/_text/cookies.htm fuer domain ?
      value = "domain:remso.eu/css/";
      document.cookie = cookie_key + "=" + value + ";expires="+ GMT +";domain=remso.eu; path=/css;";
      
      // Cookie fuer Hauptverzeichnis / des Dokuments remso.eu/_text/cookies.htm fuer domain ?
      value = "domain:remso.eu/";
      document.cookie = cookie_key + "=" + value + "; expires="+ GMT +";domain=remso.eu; path=/;";
      

      Anzeige: cookie_key=[p000] GMT=[Tue, 02 Oct 2018 12:06:47 GMT]

      Dem FF fehlt /_text/

      Das setzende Dokument findet nicht wieder /_text/ und domain:remso.eu/css/. Ich bin schon ganz fusselig in der Birne, wahrscheinlich sieht es beim nächsten Test wieder anders aus. Und jetzt ist noch nichtmal getestet, was PHP zu sehen bekommt ...

      Keine Ahnung, ob noch wer diese Problematik hat, diese Dokumentation wäre wohl etwas für selfHTML.

      Gruß, Linuchs

      1. Hi,

        Seit Monaten klappt das nur zufällig und bei jeder Programmänderung haut wieder was nicht hin. Der Grund: Die Dokumentation von Cookies ist miserabel.

        Was für ein Statement! Und nun!? Idee: Dokumentation lesen!

        MfG

        1. Hallo,

          Grund: Die Dokumentation ist miserabel. Idee: Dokumentation lesen!

          Geiler Tipp! Q.e.d weil isso.

          Gruß
          Kalk

          1. Hallo,

            Grund: Die Dokumentation ist miserabel. Idee: Dokumentation lesen!

            Geiler Tipp! Q.e.d weil isso.

            Richtig! Lieber ne POD als gar keine Doku. @Linuchs hatte nämlich vergessen die Doku zu nennen die so miserabel ist daß er sie nicht nennen möchte. Oder meint er etwa das SELF Wiki!?

            In der POD steht übrigens alles drin was man wissen muss. Und wem das nicht reicht der mache sich auf die Suche nach weiterer Literatur zum Thema Cookie.

            MfG

      2. Die Anwendung: Der Leser meines Kalenders soll per JS Lesezeichen als Cookie setzen, die von PHP verstanden und mit Daten beantwortet werden. Möglichst für www.remso.eu und remso.eu

        Ich glaube du bist auf dem falschen Dampfer unterwegs. Mein Tipp: Bau dir ein HTML-Formular für das Anlegen von Lesezeichen. In PHP liest du die gewünschten IDs aus dem $_POST-Array aus und schreibst die Werte in eine Session-Variable. Wenn du eine Login-Funktion hast, dann kannst die Daten auch in der Nutzer-Datenbank abspeichern anstelle der Session. Die Kalendarseite kann dann in der Session (bzw. der Datenbank) nach Abonnements suchen. Das würde dir das Gezanke mit Cookies ersparen.

        1. Ja klar, mann kann es auch anders machen. Normale Leser sollen nicht verpflichtet sein, sich zu registrieren.

          Inzwischen teste ich die per JS gesetzten/gelöschten Cookies mit PHP.

          Wenn ich die Seiten mit remso.eu (ohne www) aufrufe, kann ich Cookies auch für www.remso.eu setzen und löschen.

          Andersrum offenbar nicht. Wäre schön, wenn das auf Gegenseitigkeit ginge.

          function setCookie( cookie_name, cookie_value ) {
              var d = new Date();
              if ( cookie_value == "loeschen" || cookie_value < " " ) {
                d.setTime(d.getTime() - (24*60*60*1000));     // 1 Tag Vergangenheit
                var buchungstext  = "geloescht";
              } else {
                d.setTime(d.getTime() + (90*24*60*60*1000));  // 90 Tage aufbewahren
                var buchungstext  = "gesetzt";
              }
              var expires = "expires="+d.toUTCString();
              var cookie_string = cookie_name + "=" + cookie_value + "@remso.eu; "  + expires + "; path=/;";    // fuer Host remso.eu
              document.cookie   = cookie_string;
              var cookie_string = cookie_name + "=" + cookie_value + "@.remso.eu; " + expires + "; path=/; domain=remso.eu; ";  // fuer Domain www.remso.eu
              document.cookie   = cookie_string;
              // Buchungstext anzeigen
              if ( document.getElementsByClassName("buchungstext")) {
                var obj = document.getElementsByClassName("buchungstext");
          //    alert( obj.length + " buchungstext" );
                for ( var i=0; i<obj.length; i++ ) {
                  obj[i].innerHTML = "Lesezeichen (Cookie) "+cookie_name+" "+buchungstext;
                }
              }
            }
          

          Linuchs

          1. Ja klar, mann kann es auch anders machen. Normale Leser sollen nicht verpflichtet sein, sich zu registrieren.

            Das ist bei der Session-Lösung auch nicht notwendig. Ein weiterer Vorteil wäre übrigens, dass Sessions auch ohne JavaScript funktionieren. Ich habe dir den Tipp gegeben, weil ich glaube, dass du es dir unnötig schwer machst und den Wald vor lauter Bäumen nicht mehr siehst. Bei der Cookie-Lösung musst du mit zwei verschiedenen Cookie-APIs arbeiten, die JavaScript-API und die PHP-API. Beide APIs sind extrem rudimentär, sie bieten dir keine nützlichen Abstraktionen, sondern nur String-Suppe. Da hören die Ähnlichkeiten auch schon auf. Außerdem unterliegt die JavaScript-API noch Beschränkungen, sie darf Cookies nur auslesen, wenn der Server das ausdrücklich gestattet. Was hält dich bei den Cookies, Stockholm-Syndrom?

        2. Die Anwendung: Der Leser meines Kalenders soll per JS Lesezeichen als Cookie setzen, die von PHP verstanden und mit Daten beantwortet werden. Möglichst für www.remso.eu und remso.eu

          Ich glaube du bist auf dem falschen Dampfer unterwegs.

          Die Cookie-Lösung ist schon ok. Aber @Linuchs Ansatz ist komplett an der falschen Stelle und Domänen bzw, Subdomänennamen haben im Code nichts verloren!

          D.h., für www.example.com und example.com darf es keinen unterschiedlichen Code geben und schon ist das Problem gelöst. Das wäre mein Tipp.

          MfG

          1. D.h., für www.example.com und example.com darf es keinen unterschiedlichen Code geben und schon ist das Problem gelöst. Das wäre mein Tipp.

            Nein, selbst wenn beide Server sich den selben Code teilen, selbst wenn hinter den Domains der selbe Webserver steckt, werden dadurch nicht die Cookies der einen Domain auch an die andere Domain weiter gegeben.

            1. D.h., für www.example.com und example.com darf es keinen unterschiedlichen Code geben und schon ist das Problem gelöst. Das wäre mein Tipp.

              Nein, selbst wenn beide Server sich den selben Code teilen, selbst wenn hinter den Domains der selbe Webserver steckt, werden dadurch nicht die Cookies der einen Domain auch an die andere Domain weiter gegeben.

              Das hab ich weder so behauptet noch ist das notwendig daß Cookies der einen Domain an eine andere Domain weiter gegeben werden. Vielmehr soll gerade das eben nicht gemacht werden!

              MfG

  3. Lieber Linuchs,

      var_dump( $_COOKIE );
    

    In PHP ist $_COOKIE ein superglobales Array, dessen Schlüssel Du mit unset() entfernen kannst.

    array(10) {
      ...
      ["my_VIP"]=>
      string(1) "0"
      ...
    }
    

    Probiere doch einmal unset($_COOKIE['my_VIP');

    // Setzen des Verfalls-Zeitpunktes auf 1 Stunde in der Vergangenheit
    setcookie("my_VIP", "", time() - 3600);
    

    Meines Wissens kannst Du nur die Lebensdauer eines Cookies an sich festlegen, nicht jedoch eines seiner Einträge.

    Ich habe es mit Javascript gesetzt und vermute irgend eine mir nicht zugängliche Information. Wie wäre es, wenn Javascript das Cookie für einen bestimmten Ordner gesetzt hätte?

    Du hast genau ein Cookie. In dem können Schlüssel-Wert-Paare stehen. Dazu kommt eine Lebensdauer des Cookies.

    Gesetzt habe ich das Cookie mit JS:

    Es sollte völlig egal sein, womit Du Dein Cookie erzeugt hast.

    Liebe Grüße,

    Felix Riesterer.

    1. Tach!

      Probiere doch einmal unset($_COOKIE['my_VIP');

      Das hilft nicht, denn in das $_COOKIE-Array werden die Werte aus dem Request nur hinkopiert. Da gibt es keine Rückwärtsbeeinflussung der HTTP-Header. Nur über die Header kann man die Cookies auf dem Client beeinflussen.

      dedlfix.

    2. Hallo Felix,

      Du hast genau ein Cookie. In dem können Schlüssel-Wert-Paare stehen. Dazu kommt eine Lebensdauer des Cookies.

      Habe ich auch gedacht, pro Cookie-Name nur eins. Doch man kann mit demselben Namen eins für den Host (remso.eu) und eines für die Domain (.remso.eu) setzen.

      Dann zusätzlich für beliebiege Haupt- und Unterverzeichnisse beim Host und beim Domain. Jetzt weiss ich, woher die Verwirrung kommt. Siehe meinen Beitrag von 14:20

      Es sollte völlig egal sein, womit Du Dein Cookie erzeugt hast.

      Glaubst du? Cookies entziehen sich scheinbar der Wissenschaft, sind Religion.

      Linuchs

  4. Setze den Cookie neu mit demselben Namen und einem beliebigem Value (Prüfung!) aber ohne jede weitere Parameter. Ein solcher ist nur für eine Browsersitzung gültig, sollte also mit dem Schließen des Browsers von diesem gelöscht werden.

    MfG