Bir çerezi asla sona ermeyecek şekilde ayarlama


187

Bir çerez ayarlamaya ilişkin php belgelerine baktığımda, çerez için bir son kullanma tarihi ayarlayabileceğimi görüyorum. Tarayıcı oturumunun sonunda veya gelecekte bir zamanda çerezin süresinin dolmasını ayarlayabilirsiniz ancak çerezin hiçbir zaman sona ermeyecek şekilde ayarlanmasının bir yolunu göremiyorum. Bu mümkün mü ve bu nasıl başarılıyor?


13
@sAc: Bu neden kötü bir şey?
brainimus

1
Çünkü bu çerez spesifikasyonuna göre zaten mümkün değil. Asla sona ermeyecek şekilde ayarlanamaz.
Sarfraz

2
Sen kullanabilir $cookie->setMaxAge(2147483647);2080 den sonra ve birlikte, 32-bit ve 64-bit hem çalışır, hangi github.com/delight-im/PHP-Cookie
gak

Yanıtlar:


259

Tüm çerezlerin süresi çerez spesifikasyonuna göre dolar , dolayısıyla bu bir PHP sınırlaması değildir.

Çok ileri bir tarih kullanın. Örneğin, süresi on yıl içinde dolacak bir çerez ayarlayın:

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

32 bit PHP'de 2038'den sonra bir tarih ayarlarsanız , sayının etrafına sarılacağını ve anında sona eren bir çerez alacağınızı unutmayın.


8
Kabul! Ve sanırım, 20 yıl içinde web siteleri çok önde olacak, muhtemelen çerez kullanılmayacak .. @brainimus: Sadece herkesin bahsettiği eski okul sistemini kullanın - şimdiki zaman + uzak gelecekte!
jolt

13
2018 geldiğinde, 64 bit PHP kullanmıyorsak, bunun 32 bit tam sayı etrafında sarılacağını ve istemciye sıfıra yakın bir süre olarak gönderileceğini unutmayın. (Bu şu anda PHP'de 25 yıllık çerezler için oluyor.)
Riking

83
2018'de bu yorumlara geri dönmek (şimdi sadece 5 yıl uzaklıkta) ve herkesin 20 yıl sonra 2038'de Y2018 yükseltmesini uygulamak için uğraştığını görmek komik olacak. Umarım hepimiz o zamana kadar 64 bitlik her şeye atlarız 4 Aralık 292.277.026.596 Pazar günü 292 milyar yıl daha sorun olmayacak. Ölmeden önce tekilliğe ulaşmazsak, bunun için endişelenmem gerektiğini sanmıyorum.
shaunhusain

58
Bir kişi 2037 sonunda aynı bilgisayarı şimdi kullanıyorsa ... bu üzücü olurdu!
Abela

22
Bunu 2018'de okuyorum, bir an panikledim, sonra iyi olduğumu fark ettim.
The Interloper

80

Maksimum değer: 2147483647

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

Tamsayı taşmasını önlemek için zaman damgası şu şekilde ayarlanmalıdır:

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

Daha yüksek bir değer ayarlamak eski tarayıcılarda sorunlara neden olabilir.

Ayrıca çerezler hakkında RFC'ye bakın :

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.

ve RFC 2616, 14.6 Yaş :

Önbellek, temsil edebileceği en büyük pozitif tamsayıdan daha büyük bir değer alırsa veya yaş hesaplamalarından herhangi biri taşarsa, 2147483648 (2 ^ 31) değerine sahip bir Yaş üstbilgisi iletmesi GEREKİR.

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


39

Uzak bir gelecek için mutlak zaman belirleyin :

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

Kabul edilen cevapta önerildiği gibi şimdiki zamana göre hesaplamaktan daha mutlak bir zaman kullanmak daha iyidir.

32 bit sistemlerle uyumlu maksimum değer:

2147483647 = 2^31 = ~year 2038

22
2 milyarı hatırlamak kolaydır, ancak sonsuza kadar $ için ideal sayı, Ocak 2038'e karşılık gelen 2 ^ 31 - 1 = 2147483647 olacaktır. @John'un dediği gibi 2038 hatasının tamsayı taşmasını önlemek için maksimum değerdir.
David

13

Benim ayrıcalığım ilk yazı hakkında yorum yapmamı engelliyor, bu yüzden buraya gitmek zorunda kalacak.

Yukarıda belirtilen doğru cevap olarak önerilen mevcut tarihten 20 yıl önce ayarlandığında 2038 unix hatası dikkate alınmalıdır .

19 Ocak 2018 + (20 yıl) tarihindeki çereziniz, tarayıcıya ve / veya üzerinde çalıştığınız sürümlere bağlı olarak 2038 sorununu iyi etkileyebilir.


7

Hiç bitmeyen bir döngü söyleyemez misiniz, çerez geçerli tarih + 1 olarak sona erer, böylece her zaman yarın olduğu için süresinin dolması gereken tarihe asla vurmaz mı? Biraz abartılı ama sadece söylüyorum.


1
Aslında bir anlamı var. Sadece 3 aylık uygun bir 'hareketsizlik dönemi' kullanmak ve daha sonra her istekte çerezi yenilemek bir anlam ifade eder.
Stijn de Witt

@StijndeWitt Veya sadece 10 yıl. Sonra kullanıcı 10 yıl içinde ziyaret ederse güncelleyin ...
Jez

5

Bu tam olarak mümkün olmasa da, Google'ın yaptıklarına benzer bir şey yapabilir ve çerezinizi 17 Ocak 2038'de sona erecek veya eşit derecede uzakta olacak şekilde ayarlayabilirsiniz.

Tüm pratiklikte, çerezinizi 10 yıl veya 60 * 60 * 24 * 365 * 10 için ayarlamanız daha iyi olabilir.


2
Bu, 2028'in başına kadar çalışacak, bu noktada değeri aşacaksınız ve çerezler çalışmayı durduracak. Bunun yerine mutlak bir değer kullanmak daha iyidir.
davidjbullock

1
Kodunun 2028'de hala eski makinelerde çalışacağını varsayarsak ... Bir şekilde herkesin sabit tarihi güncellemeyi unutacağı konusunda endişeliyim ... Yazılım, donanımdan daha fazla yaşama eğilimindedir.
Stijn de Witt

4

İstemci makinedeki verileri kalıcı olarak devam ettirmek istiyorsanız - veya en azından tarayıcı önbelleği tamamen boşalana kadar, Javascript yerel depolamasını kullanın:

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

Oturum depolama alanını kullanmayın, çünkü en fazla Sıfır yaşına sahip bir çerez gibi temizlenecektir.


Sunucu tarafı verilerini okuma konusunda localStorage'ı göz önünde bulunduramazsınız.
WhiteHorse

1

Asla ve sonsuza dek yaşamın öngörülemezliği nedeniyle kullanmaktan kaçındığım iki kelime değildir.

1 January 1970İşaretli bir 32-bittamsayı kullanılarak kaydedilebileceği için en son süre 03:14:07 on Tuesday, 19 January 2038( 231-1 = 2,147,483,647saniye sonra 1 January 1970) . Bu sınırlama 2038 Yılı sorunu olarak bilinir

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

0

Bir çerezi sonsuza kadar sürdürebilmenin bir yolu olmadığına inanıyorum, ancak 2100 yılı gibi geleceğe çok geçecek şekilde ayarlamanız gerekiyor.


0

Bunu yapmamalısınız ve bu zaten mümkün değil, isterseniz 10 yıl gibi daha büyük bir değer ayarlayabilirsiniz.

Bu arada, böyle bir gereksinime sahip bir kurabiye görmedim :)


Birden fazla girişin bu gereksinime sahip olmasını önleyerek çok fazla uğraşmak istemeyen benzersiz cevaplı anketler için çerezleri kabul ediyorum.
Random Elephant

@sarfraz bak onun yemek değil bilgisayar çerez.
ağlar

-1

Emin değilim ama tarayıcı kapatıldığında çerezler silinmiyor mu? Bir şekilde süresi dolan bir çerez yaptım ve krom "tarayıcı kapanışında" olarak bilinen son kullanma tarihini ...


4
Çerez üzerinde bir son kullanma tarihi belirlerseniz, tarayıcınızı kapatıp yeniden açtıktan sonra da geçerliliğini korur. Bir süre sonu ayarlamazsanız, tarayıcınızı kapattığınızda varsayılan davranış silinir.
HoLyVieR

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.