Setzen Sie ein Cookie so, dass es niemals abläuft

187

Wenn ich mir die PHP-Dokumentation zum Setzen eines Cookies ansehe, sehe ich, dass ich ein Ablaufdatum für das Cookie festlegen kann. Sie können festlegen, dass das Cookie am Ende der Browsersitzung oder zu einem späteren Zeitpunkt abläuft, aber ich sehe keine Möglichkeit, das Cookie so einzustellen, dass es niemals abläuft. Ist das überhaupt möglich und wie wird das erreicht?

brainimus
quelle
13
@sAc: Warum ist das eine schlechte Sache?
Brainimus
1
Denn das ist nach der Cookie-Spezifikation sowieso nicht möglich. Es kann nicht so eingestellt werden, dass es niemals abläuft.
Sarfraz
2
Sie können verwenden $cookie->setMaxAge(2147483647);, was später als 2080 ist und sowohl auf 32-Bit als auch auf 64-Bit
funktioniert

Antworten:

259

Alle Cookies verfallen gemäß der Cookie-Spezifikation , daher ist dies keine PHP-Einschränkung.

Verwenden Sie ein weit zukünftiges Datum. Setzen Sie beispielsweise ein Cookie, das in zehn Jahren abläuft:

setcookie(
  "CookieName",
  "CookieValue",
  time() + (10 * 365 * 24 * 60 * 60)
);

Beachten Sie, dass wenn Sie in 32-Bit-PHP ein Datum nach 2038 festlegen , die Zahl umbrochen wird und Sie ein Cookie erhalten, das sofort abläuft.

Joeri Hendrickx
quelle
8
Einverstanden! Und ich denke, dass in 20 Jahren Websites weit voraus sein werden, dass möglicherweise keine Cookies verwendet werden. @Brainimus: Verwenden Sie einfach das Oldschool-System, das alle erwähnt haben - aktuelle Zeit + Zeit in ferner Zukunft!
Ruck
13
Beachten Sie, dass wenn 2018 kommt und wir kein 64-Bit-PHP verwenden, dies die 32-Bit-Ganzzahl umschließt und als Zeit nahe Null an den Client gesendet wird. (Dies geschieht gerade für 25-jährige Cookies auf PHP.)
Riking
83
Es wird lustig sein, 2018 (nur noch 5 Jahre entfernt) auf diese Kommentare zurückzukommen und zu sehen, wie sich alle bemühen, das Y2018-Upgrade dann 20 Jahre später im Jahr 2038 erneut zu implementieren. Hoffentlich schaffen wir alle bis dahin den Sprung auf 64-Bit wird für weitere 292 Milliarden Jahre am Sonntag, den 4. Dezember 292.277.026.596 kein Problem sein. Wenn wir nicht vor meinem Tod eine Singularität erreichen, muss ich mir darüber keine Sorgen machen.
Shaunhusain
58
Wenn eine Person Ende 2037 denselben Computer benutzt, den sie jetzt benutzt ... wäre das nur traurig!
Abela
22
Ich lese das im Jahr 2018, gerate für einen Moment in Panik und stelle dann fest, dass es mir gut geht.
Der Eindringling
80

Maximalwert: 2147483647

setcookie("CookieName", "CookieValue", 2147483647);

Um einen Ganzzahlüberlauf zu vermeiden, sollte der Zeitstempel auf Folgendes gesetzt werden:

2^31 - 1 = 2147483647 = 2038-01-19 04:14:07

Das Festlegen eines höheren Werts kann bei älteren Browsern zu Problemen führen.

Siehe auch den RFC zu Cookies :

Max-Age=value
  OPTIONAL.  The value of the Max-Age attribute is delta-seconds,
  the lifetime of the cookie in seconds, a decimal non-negative
  integer.  To handle cached cookies correctly, a client SHOULD
  calculate the age of the cookie according to the age calculation
  rules in the HTTP/1.1 specification [RFC2616].  When the age is
  greater than delta-seconds seconds, the client SHOULD discard the
  cookie.  A value of zero means the cookie SHOULD be discarded
  immediately.

und RFC 2616, 14,6 Alter :

Wenn ein Cache einen Wert erhält, der größer als die größte positive Ganzzahl ist, die er darstellen kann, oder wenn eine seiner Altersberechnungen überläuft, MUSS er einen Altersheader mit einem Wert von 2147483648 (2 ^ 31) senden.

http://www.faqs.org/rfcs/rfc2616.html

PiTheNumber
quelle
39

Stellen Sie eine absolute Zeit für die ferne Zukunft ein :

setcookie("CookieName", "CookieValue", 2147483647);

Es ist besser, eine absolute Zeit zu verwenden, als sie relativ zur Gegenwart zu berechnen, wie in der akzeptierten Antwort empfohlen.

Der mit 32-Bit-Systemen kompatible Maximalwert ist:

2147483647 = 2^31 = ~year 2038
David
quelle
22
2 Milliarden sind leicht zu merken, aber die ideale Zahl für $ für immer wäre 2 ^ 31 - 1 = 2147483647 entsprechend Januar 2038. Dies ist der Maximalwert, um den ganzzahligen Überlauf des 2038-Fehlers zu vermeiden, wie @John sagte.
David
13

Mein Privileg hindert mich daran, meinen Kommentar zum ersten Beitrag abzugeben, sodass er hier abgelegt werden muss.

Bei der Einstellung von 20 Jahren im Voraus ab dem aktuellen Datum sollte der Unix-Fehler 2038 berücksichtigt werden, was als die richtige Antwort oben vorgeschlagen wird.

Ihr Cookie am 19. Januar 2018 + (20 Jahre) könnte je nach Browser und / oder Version, auf der Sie ausgeführt werden, das Problem 2038 treffen.

John
quelle
7

Können Sie nicht einfach eine Endlosschleife sagen, Cookie läuft als aktuelles Datum + 1 ab, sodass es nie das Datum erreicht, an dem es ablaufen soll, weil es immer morgen ist? Ein bisschen übertrieben, aber nur sagen.

Jesus
quelle
1
Eigentlich hat er einen Punkt. Es ist sinnvoll, nur einen geeigneten Inaktivitätszeitraum von beispielsweise 3 Monaten zu verwenden und dann das Cookie bei jeder Anfrage mit diesem Zeitraum zu aktualisieren.
Stijn de Witt
@StijndeWitt Oder nur 10 Jahre. Dann aktualisieren Sie es, wenn der Benutzer innerhalb von 10 Jahren besucht ...
Jez
5

Obwohl dies nicht genau möglich ist, können Sie etwas Ähnliches wie Google tun und Ihr Cookie so einstellen, dass es am 17. Januar 2038 abläuft oder etwas ähnlich weit entferntes.

In der Praxis ist es möglicherweise besser, Ihren Cookie für 10 Jahre oder 60 * 60 * 24 * 365 * 10 zu setzen, was die meisten Maschinen überleben sollte, auf denen Ihr Cookie leben wird.

h3r2on
quelle
2
Dies funktioniert bis Anfang 2028, an diesem Punkt wird der Wert überlaufen und die Cookies funktionieren nicht mehr. Verwenden Sie stattdessen lieber einen absoluten Wert.
Davidjbullock
1
Angenommen, sein Code wird 2028 noch auf veralteten Computern ausgeführt ... Irgendwie mache ich mir mehr Sorgen, dass jeder vergisst, das feste Datum zu aktualisieren ... Software überlebt die Hardware.
Stijn de Witt
4

Wenn Sie Daten auf dem Clientcomputer dauerhaft beibehalten möchten - oder zumindest bis der Browser-Cache vollständig geleert ist -, verwenden Sie den lokalen Javascript-Speicher:

https://developer.mozilla.org/en-US/docs/DOM/Storage#localStorage

Verwenden Sie keinen Sitzungsspeicher, da dieser wie ein Cookie mit einem maximalen Alter von Null gelöscht wird.

Björn
quelle
LocalStorage kann beim Lesen von serverseitigen Daten nicht berücksichtigt werden.
WhiteHorse
1

Niemals und für immer sind zwei Wörter, die ich aufgrund der Unvorhersehbarkeit des Lebens vermeide.

Die späteste Zeit seitdem 1 January 1970, die mit einer vorzeichenbehafteten 32-bitGanzzahl gespeichert werden kann, ist 03:14:07 on Tuesday, 19 January 2038( 231-1 = 2,147,483,647Sekunden danach 1 January 1970) . Diese Einschränkung wird als Problem des Jahres 2038 bezeichnet

setCookie("name", "value", strtotime("2038-01-19 03:14:07"));
CONvid19
quelle
0

Ich glaube, dass es keine Möglichkeit gibt, ein Cookie für immer haltbar zu machen, aber Sie müssen es nur so einstellen, dass es weit in die Zukunft abläuft, wie zum Beispiel das Jahr 2100.

Joel Kennedy
quelle
0

Sie sollten das nicht tun und das ist sowieso nicht möglich. Wenn Sie möchten, können Sie einen höheren Wert festlegen, z. B. 10 Jahre im Voraus.

Übrigens habe ich noch nie einen Cookie mit einer solchen Anforderung gesehen :)

Sarfraz
quelle
Ich würde davon ausgehen, dass Cookies für eindeutig beantwortete Umfragen, die sich nicht zu sehr mit der Verhinderung mehrerer Einträge befassen möchten, diese Anforderung haben.
Zufälliger Elefant
Schauen Sie @sarfraz es ist der Computer-Cookie nicht die, die Sie essen.
Webs
-1

Ich bin nicht sicher, aber werden Cookies beim Schließen des Browsers nicht gelöscht? Ich habe irgendwie ein nie ablaufendes Cookie erstellt und Chrome hat das abgelaufene Datum als "beim Schließen des Browsers" erkannt ...

bläulich
quelle
4
Wenn Sie ein Cookie für das Cookie festlegen, bleibt es nicht unbedingt erhalten, nachdem Sie Ihren Browser geschlossen und erneut geöffnet haben. Wenn Sie keinen Ablauf festlegen, wird das Standardverhalten gelöscht, wenn Sie Ihren Browser schließen.
HoLyVieR
-2

Sie können nur, was ist, wenn Sie die Ablaufzeit auf jetzt + 100 Jahre einstellen?

Boris Delormas
quelle
3
Nein, denn das würde den Maximalwert im Januar 2038 überschreiten.
Davidjbullock