Aynı ada sahip birden fazla çerez nasıl kullanılır?


92

Örneğin, "a" adlı çerez olarak ayarlamak için aşağıdaki HTTP başlıklarını gönderen bir uygulamam olduğunu varsayalım:

Set-Cookie: a=1;Path=/;Version=1
Set-Cookie: a=2;Path=/example;Version=1

/exampleSunucuya erişirsem her iki yol da geçerli olur, bu nedenle "a" adında iki çerezim olur! Tarayıcı herhangi bir yol bilgisi göndermediğinden, iki tanımlama bilgisi ayırt edilemez.

Cookie: a=2; a=1

Bu durum nasıl ele alınmalı? İlki mi seçilsin? Tüm çerez değerlerini içeren bir liste oluşturulsun mu? Yoksa böyle bir durum bir geliştiricinin hatası olarak değerlendirilmeli mi?


Yinelenen çerez adlarından kaçınmak için elimden gelenin en iyisini yapardım (okuyun: yapabileceğim her şeyi). Çoğu insan bu konuyla hiç karşılaşmadı - iyi bir sebepten dolayı.

Web sitesi yalnızca kendi çerezini okuyabilir. Diğer web sitesinin / alanın çerezini okuyamaz. Bu güvenlik tarayıcı ile sağlanır. Bu, yeni başlayanlar için bir ipucu olabilir (bu kafa karışıklığını yaşadım)
Arun

Yanıtlar:


38

Gönderen SitePoint bu makaleye :

Aynı adda birden fazla çerez belirli bir istek URI'siyle eşleşirse, tarayıcı tarafından biri seçilir.

Yol ne kadar spesifik olursa, öncelik o kadar yüksek olur. Ancak, etki alanı dahil diğer özniteliklere dayalı öncelik belirlenmemiştir ve tarayıcılar arasında farklılık gösterebilir. Bu, ".example.org" ve "www.example.org" yerine aynı adlı çerezleri ayarlarsanız, hangisinin geri gönderileceğinden emin olamayacağınız anlamına gelir.

Düzenleme: 2010 yılına ait bu bilgiler eski görünüyor, tarayıcılar artık karşılığında birden fazla çerez gönderebilir, ayrıntılar için aşağıdaki @Nate yanıtına bakın


9
Öyleyse birden fazla özdeş çerez nasıl silinebilir? İki gündür buna dayandım ve yinelenen kurabiyeler yok edilemez görünüyor.
Bob Jones

13
@Brant Bu makale biraz yanlış olabilir - Chrome'un aynı adda (ancak farklı yollarda) iki çerez gönderdiğini gördüm, bu nedenle "tarayıcı tarafından bir tanesinin seçilmesi" doğru değil. İlk olarak en derin yol çerezi gönderildi, BTW, bu makul görünüyor. Ve arada başka bir kurabiye de yaptı.
Jonas N

3
Firefox (15) ayrıca aynı ada sahip iki çerez gönderir! etki alanı .a.comve ana bilgisayar için iki çerezle karşılaştıysaa.com
Taha Jahangir

Aslında bu bilgi yanlıştır. @Nate'in cevabı doğru olarak işaretlenmelidir.
Dan Milon

5
404: Ünlü @ Nate'in cevabı bulunamadı.
d.popov

90

SitePoint'teki bir makaleye atıfta bulunan cevap tamamen eksiksiz değil. Bakınız RFC 6265 (olmaya fuarı, bu RFC bu soruyu önceki yerine geçer, hangi yayınlanmıştır sonra 2011 yılında piyasaya sürüldü RFC 2965 , 2000 ve gelen RFC 2109 1997).

Bölüm 5.4 , alt bölüm 2 şunu söylemektedir:

Kullanıcı aracısı, çerez listesini aşağıdaki sırayla SIRALAMALIDIR:

  • Daha uzun yolları olan tanımlama bilgileri, daha kısa yolları olan tanımlama bilgilerinden önce listelenir.

NOT: Tüm kullanıcı aracıları çerez listesini bu sıraya göre sıralamaz, ancak bu sıra, bu belge yazılırken yaygın uygulamayı yansıtır ve geçmişte bu sıraya bağlı (hatalı olarak) sunucular olmuştur.

Bölüm 4.2.2'de de şu küçük mücevher var :

... sunucular serileştirme sırasına GÜVENMEMELİDİR. Özellikle, Çerez başlığı aynı ada sahip iki çerez içeriyorsa (örneğin, farklı Yol veya Etki Alanı öznitelikleriyle ayarlanmış olanlar), sunucular bu çerezlerin başlıkta görünme sırasına güvenmemelidir.

Senin örneğin isteği çerezindeki ( Cookie: a = 2; a = 1 ) yolu ile çerez grubu olduğu not / örneğin ( a = 2 ) yolu ile olandan daha uzun bir yol vardır / ( a = 1 ) ve onunla yüzden şartnamenin önerisiyle eşleşen ilk sırada size geri gönderilir. Böylece az ya da çok doğru senin varsayımı altında oradaki vardır verebilir ilk değeri seçin.

Ne yazık ki, RFC'lerde kullanılan dil son derece spesifiktir - GEREKLİ ve GEREKLİ sözcüklerinin kullanımı RFC'lerde belirsizlik yaratmamalıdır. Bu kuralları belirtmek gerekir izlenecek fakat değildir gerekli spec uyumlu olmak üzere. Bunun için RFC'yi oldukça iyi anlasam da, gerçek dünyadaki müşterilerin ne yaptığını görmek için araştırma yapmadım; HTTP istemcileri olarak görev yapan bir veya daha fazla tarayıcı veya diğer yazılımlar , Cookie: başlığında ilk olarak en uzun yol tanımlama bilgisini (örneğin: / example ) gönderemeyebilir .

Çerezin değerini kontrol edebilecek bir konumdaysanız ve çözümünüzü kusursuz hale getirmek istiyorsanız, en iyisi şunlardan biri olur:

  1. belirli yollarda geçersiz kılmak için farklı bir çerez adı kullanmak, örneğin:

    • Set-çerez: a-global = 1; Yol = /; Sürüm = 1
    • Set-cookie: a-example = 2; Path = / example; Sürüm = 1
  2. İhtiyacınız olan yolu çerez değerinin kendisinde saklamak:

    • Set-çerez: a = 1 & yol = /; Yol = /; Sürüm = 1
    • Set-çerez: a = 2 & yol = / örnek; Yol = / örnek; Sürüm = 1

Bu geçici çözümlerin her ikisi de, istenen URL'yi mevcut tanımlama bilgileri listesiyle karşılaştırarak istenen tanımlama bilgisi değerini seçmek için sunucuda ek mantık gerektirir. Çok hoş değil. Talihsizlik, RFC'nin daha uzun bir yolun daha kısa bir yola sahip bir çerezi tamamen geçersiz kılmasını gerektirecek öngörüye sahip olmaması talihsiz bir durumdur (örneğin, sizin örneğinizde, yalnızca Çerez: a = 2 alacaksınız ).


2
Bunu bu lanet RFC'lerden çıkardığınız için teşekkür ederiz! // kimse bu tavsiyelere
Rast

3
Görünüşe göre Wildfly 8.0, çerezlerin sırasına dikkat ediyor ve ilkini kullanıyor. Bu, başka bir uygulamayı 'iç içe geçmiş' bir bağlamda çalıştırmamızı sağlar. Ancak, bazı tarayıcılar RFC'nin önerisine uymazsa başarısız olur. JSESSIONID2 gibi farklı bir oturum tanımlama bilgisi adı belirlemek için bunu yapmanın doğru yolu.
honzajde

2
Cevabınızı okuduktan sonra başlıca tarayıcıları test ettim: Chrome 63 / Opera 55 / IE11 / Edge 16 / Safari 11 / Firefox 58 Ve hepsi doğru bir şekilde işliyor gibi görünüyor ki, daha uzun yolu olan Çerez, daha kısa yollu olandan önce. Ve PHP'de (sürüm 7'de test edilmiştir) yalnızca $ _COOKIE değişkenine ayarlanan ilk çerezi okur.
Alexander Schranz

1
path=/;Path=/Spesifikasyon FRC-6265'e uygun mu ? Ben böyle bir söz bulamadım. Tomcat herhangi bir ";" yolda yanlış sembol olarak
Hubbitus

1
@Hubbitus Dikkat edin, bu a=2&path=/example;Path=/exampleyüzden ;yol yok .
Franklin Yu

2

Aynı isim için birden fazla değere sahip olmanın yanlış bir tarafı yoktur ... eğer isterseniz. Değere ek bağlam bile yerleştirebilirsiniz.

Eğer yapmazsanız, elbette her iki bağlamı da istiyorsanız farklı isimler bir çözümdür.

Alternatif, aynı çerez adını, daha özel yollardan bile aynı yolla (ve etki alanıyla) göndermektir. Bu ayarlanmış çerez talimatları, bu çerezin değerinin üzerine yazacaktır.

Artık en önemli kısmı (bunların nasıl çalıştığını) bildiğinize ve ihtiyacınız olan şeyi birkaç farklı şekilde gerçekleştirebileceğinize göre, sorunuza cevabım şu: bu bir geliştirici sorunu.


0

Bunu, birden çok oturum kimliği kullanarak kapsamlı bir şekilde yapan ve tutarlı bir şekilde çalışan uygulamaların kesinlikle farkındayım. Ancak bilmiyorum - ve bulmaya niyetim yok - bunu yapıyorlarsa, tarayıcı çerezleri ne zaman ayarlandıklarına / hangi yol için ayarlandıklarına veya uygulamanın her birini eşleştirmeye çalışıp çalışmadığına bağlı olarak tutarlı bir sırayla döndürürse mevcut bir oturuma bir.

Bu uygulamadan kaçınılmasını şiddetle tavsiye ederim.

Bununla birlikte, tarayıcıların (ve uygulamaların) bu senaryoyu nasıl ele aldığını gerçekten bilmek istiyorsanız, neden bir test donanımı oluşturup denemiyorsunuz?


2
Bir sunucunun, tarayıcı tarafından kendisine gönderilenler üzerinde hiçbir kontrolü yoktur. Hâlâ ele alınması gerekiyor.
Martin OConnor

0

Java / Scala çerçevesini kullanıyorsanız Play: dikkatli olun! Bir istek aynı ada sahip birden fazla çerez içeriyorsa, Play bunlardan yalnızca 1 tanesini kodunuza sunar.


-2

Bunları ayırt etmeniz gerekirse, onlara farklı anahtar değerler vermelisiniz.

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.