Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Cookie expire date

Einklappen

Neue Werbung 2019

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

  • Phpyton
    hat ein Thema erstellt [Erledigt] Cookie expire date.

    [Erledigt] Cookie expire date

    Hallo allerseits. Erst kürzlich habe ich ein Thema eröffnet, um über UNIX-Timestamps zu diskutieren und war am Ende fest entschlossen diese zu vermeiden (Y2K38 betreffend). Nun habe ich beim durchforsten der php.de Seite festgestellt, dass beim Setzen eines Cookies beim dritten Parameter (expire) ein UNIX-Timestamp gefordert wird. Und jetzt bin ich deprimiert. Kann man das nicht normal mit Datumsangaben lösen? Oder wie machen die Experten unter euch das?

  • Gast-Avatar
    Ein Gast antwortete
    Also ich benutze das Prinzip z.B. hier auf PHP.de. Es ist inhaltlich durchaus ein Unterschied, eingeloggt zu bleiben und einen Mechanismus zum Password-Autofill zu benutzen.
    Aber dafür gibts wirklich Browser-Tools. Ich finde das Vorhaben ein wenig sinnlos.

    Einen Kommentar schreiben:


  • tr0y
    antwortet
    Zitat von jspit Beitrag anzeigen
    ++

    De folgenden Ausführungen haben daher mehr informativen Charakter.

    Für das 2038 Problem ist nicht die PHP-Version verantwortlich, sondern das System (32/64 Bit). Die Konstante PHP_INT_SIZE gibt darüber Auskunft.
    Für 32-Bit-Systeme hat PHP_INT_SIZE den Wert 4, für 64-bit-Systeme den Wert 8.

    Die Konstante kann benutzt werden, um die Lebenszeit des Cookies systemunabhängig auf einen möglichst großen Wert zu setzen:

    PHP-Code:
    setcookie("TestCookie""Wert2"PHP_INT_SIZE strtotime('31.12.9999') : PHP_INT_MAX); 
    Auch auf 64-Bit_Systemen darf die Jahreszahl auch nicht größer als 9999 sein, PHP_INT_MAX ist dort nicht nutzbar.

    Resultat:
    32-Bit:
    Gültig bis: Dienstag, 19. Januar 2038 04:14:07

    64-bit:
    Gültig bis: Donnerstag, 30. Dezember 9999 23:59:59



    LG jspit
    Also ich bin für die Abschaffung eines Integer-Values für das Cookie-Expire.

    PHP-Code:
    setcookie('foo''bar''+1 year'); 

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    Aber wir können ja mal gerne frage, wer die Implementierung für sinnvoll hielte, bzw. selbst auf Seiten diese Funktion nutzt.
    Also ich benutze das Prinzip z.B. hier auf PHP.de. Es ist inhaltlich durchaus ein Unterschied, eingeloggt zu bleiben und einen Mechanismus zum Password-Autofill zu benutzen.
    Anmerkung: Ausserdem ist das wie mit JavaScript. Wenn ein User Cookies nicht aktiviert hat, kann er die Funktion ohnehin nicht nutzen. Und bau lieber eine Seite, die du so weit wie möglichst von Browsereinstellungen entkoppelst.
    Quatsch. Ohne Cookies gibts sinnvoll keine Session-basierten Dienste. Ergo dann auch keine Usersession, um den Passwortschutz aufrecht zu erhalten.

    Einen Kommentar schreiben:


  • jspit
    antwortet
    Zitat von Tropi Beitrag anzeigen
    1. Das Jahr 2038 ist ein Problem von 32-Bit Systemen. Ich denke das wir in 25 Jahren davon nicht mehr viele sehen werden.
    2. Wenn du glaubst das deine Anwendung 25 Jahre unverändert übersteht lebst du weit weg von der Realität. Vor 25 Jahren gabs PHP noch nicht mal, und ich behaupte in den nächsten 25 Jahren wird sich da ähnlich viel tun.
    ++

    De folgenden Ausführungen haben daher mehr informativen Charakter.

    Für das 2038 Problem ist nicht die PHP-Version verantwortlich, sondern das System (32/64 Bit). Die Konstante PHP_INT_SIZE gibt darüber Auskunft.
    Für 32-Bit-Systeme hat PHP_INT_SIZE den Wert 4, für 64-bit-Systeme den Wert 8.

    Die Konstante kann benutzt werden, um die Lebenszeit des Cookies systemunabhängig auf einen möglichst großen Wert zu setzen:

    PHP-Code:
    setcookie("TestCookie""Wert2"PHP_INT_SIZE strtotime('31.12.9999') : PHP_INT_MAX); 
    Auch auf 64-Bit_Systemen darf die Jahreszahl auch nicht größer als 9999 sein, PHP_INT_MAX ist dort nicht nutzbar.

    Resultat:
    32-Bit:
    Gültig bis: Dienstag, 19. Januar 2038 04:14:07

    64-bit:
    Gültig bis: Donnerstag, 30. Dezember 9999 23:59:59



    LG jspit

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    @Phpyton: Ich würde auf die Funktion ganz verzichten. Das stammte aus einer Zeit, in der Browser noch nichts konnten, aber was du versuchst ist reines Browserverhalten nachzubilden. Wenn ein User der Meinung ist seine Logindaten nicht jedes Mal neu eingeben zu müssen, dann soll er sie mit seinem Browser speichern und ihn sein Browser jedes Mal einloggen. Denn so weiss er auch selbst, wo er sein Passwort speichert (zuhause) und wo nicht (Internet-Cafe). Ich finde es spricht rein gar nichts für das Implementieren einer solchen Funktion. Wenn du keinen trifftigen Grund hast, dann lass sie am besten ganz weg. Ich z.B. hinterlege alle Logininformationen direkt in meinem Firefox und verzichte auf das Aktivieren solcher Funktionen.
    Aber wir können ja mal gerne frage, wer die Implementierung für sinnvoll hielte, bzw. selbst auf Seiten diese Funktion nutzt.
    Anmerkung: Ausserdem ist das wie mit JavaScript. Wenn ein User Cookies nicht aktiviert hat, kann er die Funktion ohnehin nicht nutzen. Und bau lieber eine Seite, die du so weit wie möglichst von Browsereinstellungen entkoppelst.

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    das Format hinter COOKIE ist nicht RFC-treu
    Ja das dachte ich mir.

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    Ich kenne genug, die frohen Mutes den expire ihres cookies auf 10 Jahre setzen und nicht wissen, was ab 2038 los ist.
    Entscheidend ist doch, ob Du das tust. Ich sehe den Punkt gerade nicht.

    Einen Kommentar schreiben:


  • tr0y
    antwortet
    Ich hab das grad mal durchgetestet, Die Cookie-Klassen-Modifikation verwendet ein Falsches Datums-Format, ich besser das grad mal aus.

    Man soll es nicht glauben aber das Format hinter COOKIE ist nicht RFC-treu und funktioniert nicht, das Format der Konstante RFC1123 allerdings schon ( wie auch in der RFC angegeben ).

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    Du bist der Beste. Vielmals Dankeschön.

    Einen Kommentar schreiben:


  • tr0y
    antwortet
    RFC: http://tools.ietf.org/html/rfc6265
    Header Field Value zusammen bauen: https://github.com/symfony/HttpFound...Cookie.php#L82

    Bei dem konkreten Cookie-Objekt von Symfony:
    PHP-Code:
    header('Set-Cookie: '.((string) $cookieObject), false200); 
    Das Objekt müsstest du aber auf DateTime umbauen.

    Kann dann so aussehen:

    Symfony Response
    PHP-Code:
        public function sendHeaders()
        {
            if ( 
    headers_sent() ) {
                return 
    $this;
            }

            
    // status
            
    header(sprintf('HTTP/%s %s %s'$this->version$this->statusCode$this->statusText), true$this->statusCode);

            
    // headers
            
    foreach ( $this->headers->allPreserveCase() as $name => $values ) {
                foreach ( 
    $values as $value ) {
                    
    header(sprintf('%s: %s'$name$value), false$this->statusCode);
                }
            }

            
    // cookies
            
    foreach ( $this->headers->getCookies() as $cookie ) {
                
    header('Set-Cookie: '.((string) $cookie), false$this->statusCode);
            }

            return 
    $this;
        } 
    Symfony Cookie:
    PHP-Code:
        public function __construct($name$value null$expire 0$path '/'$domain null$secure false$httpOnly true)
        {
            if ( 
    preg_match("/[=,; \t\r\n\013\014]/"$name) ) {
                throw new \
    InvalidArgumentException(
                    
    sprintf('The cookie name "%s" contains invalid characters.'$name)
                );
            }

            if ( empty(
    $name) ) {
                throw new 
    InvalidArgumentException(
                    
    'The cookie name cannot be empty.'
                
    );
            }

            if ( 
    $expire === ) {
                
    $expire null;
            }
            else if ( ! 
    $expire instanceof \DateTime && ! is_numeric($expire) ) {
                
    $expire date_create($expire);

                if ( 
    false === $expire ) {
                    throw new \
    InvalidArgumentException('The cookie expiration time is not valid.');
                }
            }
            else if ( ! 
    $expire instanceof \DateTime && is_numeric($expire) ) {
                
    $expire date_create_from_format('U'$expire);
            }

            
    $this->name $name;
            
    $this->value $value;
            
    $this->domain $domain;
            
    $this->expire $expire;
            
    $this->path = empty($path) ? '/' $path;
            
    $this->secure = (bool) $secure;
            
    $this->httpOnly = (bool) $httpOnly;
        }

        public function 
    getExpiresTime()
        {
            throw new \
    LogicException('This Cookie is not compatible with unix time based cookies');
        }

        public function 
    getExpiresDateTime()
        {
            return 
    $this->expire;
        }

        public function 
    isCleared()
        {
            return 
    $this->expire date_create();
        }

        public function 
    __toString()
        {
            
    $str urlencode($this->getName()).'=';

            if ( 
    '' === (string) $this->getValue() ) {
                
    $str .= 'deleted; expires ='.date_create('-1 year')->format(\DateTime::RFC1123);
            }
            else {
                
    $str .= urlencode($this->getValue());

                if ( 
    $this->getExpiresDateTime() instanceof \DateTime ) {
                    
    $str .= '; expires='.$this->getExpiresDateTime()->format(\DateTime::RFC1123);
                }
            }

            if ( 
    $this->path ) {
                
    $str .= '; path='.$this->path;
            }

            if ( 
    $this->getDomain() ) {
                
    $str .= '; domain='.$this->getDomain();
            }

            if ( 
    true === $this->isSecure() ) {
                
    $str .= '; secure';
            }

            if ( 
    true === $this->isHttpOnly() ) {
                
    $str .= '; httponly';
            }

            return 
    $str;
        } 
    Reicht dir das als Beispiel ?

    Ist soweit auch Laravel-Kompatibel.

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    Hintergrund ist eine typische "Eingeloggt bleiben" funktion. Man kann zur Anwendung trotz geschlossenem Browserfenster zurückkehren und bleibt dann eingeloggt.
    @Tr0y: Hast du ein Beispiel: Hab noch nie etwas dergleichen gesehen.

    Einen Kommentar schreiben:


  • tr0y
    antwortet
    Sende eigene Header und verzichte auf setcookie.

    DateTime hat eine COOKIE-Konstante wo du dir das Format abholen kannst.

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    Ich würde aber gern jetzt wissen, wie ich optimal verfahren muss. So lange kann ich nicht warten.

    Einen Kommentar schreiben:


  • Tropi
    antwortet
    Bis dahin gibt time() dann eben eine long und keine int mehr zurück...

    Einen Kommentar schreiben:

Lädt...
X