Définir un cookie pour qu'il n'expire jamais

196

En regardant la documentation php sur la configuration d'un cookie, je vois que je peux définir une date d'expiration pour le cookie. Vous pouvez configurer le cookie pour qu'il expire à la fin de la session du navigateur ou à un moment donné dans le futur, mais je ne vois pas de moyen de configurer le cookie pour qu'il n'expire jamais. Est-ce même possible et comment est-ce possible?

brainimus
la source
14
@sAc: Pourquoi est-ce une mauvaise chose?
brainimus
1
Parce que ce n'est de toute façon pas possible selon la spécification des cookies. Il ne peut pas être configuré pour ne jamais expirer.
Sarfraz
2
Vous pouvez utiliser $cookie->setMaxAge(2147483647);, qui est postérieur à 2080 et fonctionne à la fois sur 32 bits et 64 bits, avec github.com/delight-im/PHP-Cookie
caw

Réponses:

269

Tous les cookies expirent conformément à la spécification des cookies , il ne s'agit donc pas d'une limitation PHP.

Utilisez une date très future. Par exemple, définissez un cookie qui expire dans dix ans:

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

Notez que si vous définissez une date après 2038 en PHP 32 bits, le numéro sera bouclé et vous obtiendrez un cookie qui expire instantanément.

Joeri Hendrickx
la source
8
D'accord! Et je pense que dans 20 ans, les sites Web seront loin devant, que probablement aucun cookie ne sera utilisé. @Brainimus: Il suffit d'utiliser le système oldschool que tout le monde a mentionné - l'heure actuelle + l'heure dans un avenir lointain!
tomsseisums
13
Sachez que lorsque 2018 arrivera, si nous n'utilisons pas PHP 64 bits, cela enveloppera l'entier 32 bits et sera envoyé au client avec un temps proche de zéro. (Cela se produit actuellement pour les cookies de 25 ans sur PHP.)
Riking
85
Il sera amusant de revenir sur ces commentaires en 2018 (dans seulement 5 ans maintenant) et de voir que tout le monde se démène pour mettre en œuvre la mise à niveau Y2018, puis à nouveau 20 ans plus tard en 2038. ne sera pas un problème avant 292 milliards d'années le dimanche 4 décembre 292 277 026 596. À moins que nous n'atteignions une singularité avant de mourir, je ne pense pas que j'aurai à m'inquiéter pour celle-là.
shaunhusain
59
Si une personne utilise le même ordinateur à la fin de 2037 qu'elle utilise maintenant ... ce serait juste triste!
Abela
24
Je lis ceci en 2018, paniqué pendant un moment, puis j'ai réalisé que j'allais bien.
The Interloper
83

Valeur maximale: 2147483647

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

Pour éviter un débordement d'entier, l'horodatage doit être défini sur:

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

La définition d'une valeur plus élevée peut entraîner des problèmes avec les anciens navigateurs.

Voir également la RFC sur les 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.

et RFC 2616, 14,6 Âge :

Si une antémémoire reçoit une valeur supérieure au plus grand entier positif qu'elle peut représenter, ou si l'un de ses calculs d'âge déborde, elle DOIT transmettre un en-tête Age avec une valeur de 2147483648 (2 ^ 31).

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

PiTheNumber
la source
41

Définissez une heure absolue lointaine :

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

Il vaut mieux utiliser un temps absolu que de le calculer par rapport au présent comme recommandé dans la réponse acceptée.

La valeur maximale compatible avec les systèmes 32 bits est:

2147483647 = 2^31 = ~year 2038
David
la source
23
2 milliards est facile à retenir mais le nombre idéal pour $ forever serait 2 ^ 31 - 1 = 2147483647 correspondant à janvier 2038. C'est la valeur maximale pour éviter le débordement d'entier du bogue 2038 comme l'a dit @John.
David
13

Mon privilège m'empêche de faire mon commentaire sur le premier post donc il devra aller ici.

Il faut tenir compte du bogue Unix 2038 lors de la configuration 20 ans à l'avance de la date actuelle, ce qui est suggéré comme la bonne réponse ci-dessus.

Votre cookie du 19 janvier 2018 + (20 ans) pourrait bien rencontrer un problème en 2038 en fonction du navigateur et / ou des versions sur lesquelles vous vous trouvez.

John
la source
7

Ne pouvez-vous pas simplement dire une boucle sans fin, le cookie expire à la date actuelle + 1 afin qu'il n'atteigne jamais la date à laquelle il est censé expirer parce que c'est toujours demain? Un peu exagéré mais juste en disant.

Jésus
la source
1
En fait, il a raison. Le simple fait d'utiliser une `` période d'inactivité '' appropriée de, par exemple, 3 mois, puis d'actualiser le cookie avec cette période à chaque demande a du sens.
Stijn de Witt le
@StijndeWitt Ou juste 10 ans. Ensuite, mettez-le à jour si l'utilisateur visite dans les 10 ans ...
Jez
5

Bien que ce ne soit pas tout à fait possible, vous pouvez faire quelque chose de similaire à ce que fait Google et configurer votre cookie pour qu'il expire le 17 janvier 2038 ou quelque chose d'aussi loin.

Dans tous les aspects pratiques, vous feriez peut-être mieux de configurer votre cookie pendant 10 ans ou 60 * 60 * 24 * 365 * 10, ce qui devrait survivre à la plupart des machines sur lesquelles votre cookie vivra.

h3r2on
la source
2
Cela fonctionnera jusqu'au début de 2028, date à laquelle vous dépasserez la valeur et les cookies cesseront de fonctionner. Mieux vaut utiliser une valeur absolue à la place.
davidjbullock
1
En supposant que son code fonctionnera toujours sur des machines obsolètes en 2028 ... D'une manière ou d'une autre, je crains davantage que tout le monde oublie de mettre à jour la date fixée ... Le logiciel a tendance à survivre au matériel.
Stijn de Witt le
5

Si vous souhaitez conserver les données sur l'ordinateur client de manière permanente, ou au moins jusqu'à ce que le cache du navigateur soit complètement vidé, utilisez le stockage local Javascript:

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

N'utilisez pas le stockage de session, car il sera effacé comme un cookie avec un âge maximum de zéro.

Björn
la source
Je ne peux pas considérer localStorage lorsqu'il s'agit de lire des données côté serveur.
WhiteHorse
1

Jamais et pour toujours sont deux mots que j'évite d'utiliser en raison de l'imprévisibilité de la vie.

La dernière heure depuis 1 January 1970laquelle cela peut être stocké à l'aide d'un 32-bitentier signé est 03:14:07 on Tuesday, 19 January 2038( 231-1 = 2,147,483,647secondes après 1 January 1970) . Cette limitation est connue sous le nom de problème de l' année 2038

setCookie("name", "value", strtotime("2038-01-19 03:14:07"));
Pedro Lobito
la source
0

Je pense qu'il n'y a pas de moyen de faire durer un cookie pour toujours, mais il vous suffit de le configurer pour qu'il expire très loin dans le futur, comme l'année 2100.

Joël Kennedy
la source
0

Vous ne devriez pas faire cela et ce n'est de toute façon pas possible.Si vous le souhaitez, vous pouvez définir une valeur plus élevée, par exemple 10 ans à l'avance.

Au fait, je n'ai jamais vu un cookie avec une telle exigence :)

Sarfraz
la source
Je suppose que les cookies pour les sondages à réponse unique qui ne veulent pas trop se soucier d'empêcher plusieurs entrées ont cette exigence.
Random Elephant
regardez @sarfraz c'est le cookie informatique pas celui que vous mangez.
webs
-1

Je ne suis pas sûr, mais les cookies ne sont-ils pas supprimés à la fermeture du navigateur? J'ai en quelque sorte fait un cookie qui n'expire jamais et Chrome a reconnu la date d'expiration comme "à la fermeture du navigateur" ...

paulgavrikov
la source
4
Pas nécessairement, si vous définissez une date d'expiration sur le cookie, il survivra après la fermeture de votre navigateur et sa réouverture. Si vous ne définissez pas d'expiration, le comportement par défaut sera de supprimer lorsque vous fermez votre navigateur.
HoLyVieR
-2

Vous ne pouvez pas mais que faire si vous définissez le délai d'expiration à maintenant + 100 ans?

Boris Delormas
la source
3
Non, car cela dépasserait la valeur maximale en janvier 2038.
davidjbullock