Ankündigung
Einklappen
Keine Ankündigung bisher.
[Erledigt] Cookie expire date
Einklappen
Neue Werbung 2019
Einklappen
X
-
[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?Stichworte: -
-
Ein Gast antworteteAber dafür gibts wirklich Browser-Tools. Ich finde das Vorhaben ein wenig sinnlos.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.
-
Also ich bin für die Abschaffung eines Integer-Values für das Cookie-Expire.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:
Auch auf 64-Bit_Systemen darf die Jahreszahl auch nicht größer als 9999 sein, PHP_INT_MAX ist dort nicht nutzbar.PHP-Code:setcookie("TestCookie", "Wert2", PHP_INT_SIZE > 4 ? strtotime('31.12.9999') : PHP_INT_MAX);
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
PHP-Code:setcookie('foo', 'bar', '+1 year');
Einen Kommentar schreiben:
-
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 wir können ja mal gerne frage, wer die Implementierung für sinnvoll hielte, bzw. selbst auf Seiten diese Funktion nutzt.
Quatsch. Ohne Cookies gibts sinnvoll keine Session-basierten Dienste. Ergo dann auch keine Usersession, um den Passwortschutz aufrecht zu erhalten.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:
-
++Zitat von Tropi Beitrag anzeigen1. 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:
Auch auf 64-Bit_Systemen darf die Jahreszahl auch nicht größer als 9999 sein, PHP_INT_MAX ist dort nicht nutzbar.PHP-Code:setcookie("TestCookie", "Wert2", PHP_INT_SIZE > 4 ? strtotime('31.12.9999') : PHP_INT_MAX);
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:
-
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:
-
Ein Gast antworteteJa das dachte ich mir.das Format hinter COOKIE ist nicht RFC-treu
Einen Kommentar schreiben:
-
Entscheidend ist doch, ob Du das tust. Ich sehe den Punkt gerade nicht.Ich kenne genug, die frohen Mutes den expire ihres cookies auf 10 Jahre setzen und nicht wissen, was ab 2038 los ist.
Einen Kommentar schreiben:
-
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:
-
Ein Gast antworteteDu bist der Beste. Vielmals Dankeschön.
Einen Kommentar schreiben:
-
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:
Das Objekt müsstest du aber auf DateTime umbauen.PHP-Code:header('Set-Cookie: '.((string) $cookieObject), false, 200);
Kann dann so aussehen:
Symfony Response
Symfony Cookie: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;
}
Reicht dir das als Beispiel ?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 === 0 ) {
$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;
}
Ist soweit auch Laravel-Kompatibel.
Einen Kommentar schreiben:
-
Ein Gast antworteteHintergrund 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:
-
Sende eigene Header und verzichte auf setcookie.
DateTime hat eine COOKIE-Konstante wo du dir das Format abholen kannst.
Einen Kommentar schreiben:
-
Ein Gast antworteteIch würde aber gern jetzt wissen, wie ich optimal verfahren muss. So lange kann ich nicht warten.
Einen Kommentar schreiben:
-
Bis dahin gibt time() dann eben eine long und keine int mehr zurück...
Einen Kommentar schreiben:

Einen Kommentar schreiben: