bu bir şipşak:
Olması gerektiğini düşünebilirsiniz, ama gerçekten hiç değil!
Hem çerez adı hem de değerde izin verilen karakterler nelerdir?
Eski Netscape cookie_spec'e göre tüm NAME=VALUE
dize:
noktalı virgül, virgül ve beyaz boşluk hariç bir dizi karakter.
Bu yüzden -
çalışmalı ve burada aldığım tarayıcılarda sorun yok gibi görünüyor; onunla nerde sorun yaşıyorsun?
Yukarıdakilerin uygulanmasıyla:
=
dahil etmek yasaldır ancak potansiyel olarak belirsizdir. Tarayıcılar her zaman dizgideki ilk =
sembolün adını ve değerini böler , böylece pratikte =
NAME yerine DEĞER'e bir sembol koyabilirsiniz .
Bahsetmeyenler, çünkü Netscape teknik özellikleri yazmakta korkunçtu, ancak tarayıcılar tarafından sürekli olarak destekleniyor gibi görünüyor:
NAME veya VALUE boş dizeler olabilir
Hiçbir varsa =
hiç dizesinde sembol, tarayıcılar boş-string adı ile çerez olarak davranın, yani Set-Cookie: foo
aynıdır Set-Cookie: =foo
.
tarayıcılar boş ada sahip bir çerez çıkardığında, eşittir işaretini atlarlar. Yani Set-Cookie: =bar
başlıyor Cookie: bar
.
eşittir işaretinin etrafındaki boşluklar kesilmiş olsa da, ad ve değerlerde virgül ve boşluklar gerçekten işe yarıyor gibi görünüyor
(kontrol karakterleri \x00
için \x1F
artı \x7F
) izin verilmez
Bahsedilmeyen ve tarayıcılar tamamen tutarsız, ASCII olmayan (Unicode) karakterler:
- Opera ve Google Chrome'da, UTF-8 ile Çerez başlıklarına kodlanırlar;
- IE'de, makinenin varsayılan kod sayfası kullanılır (yerel ayara özgü ve asla UTF-8);
- Firefox (ve diğer Mozilla tabanlı tarayıcılar) her UTF-16 kod noktasının düşük baytını tek başına kullanır (bu nedenle ISO-8859-1 uygundur, ancak başka bir şey karıştırılır);
- Safari, ASCII olmayan karakterler içeren herhangi bir çerez göndermeyi reddediyor.
dolayısıyla pratikte çerezlerde ASCII olmayan karakterler kullanamazsınız. Unicode, kontrol kodları veya diğer rastgele bayt dizilerini kullanmak istiyorsanız, cookie_spec, kendi seçtiğiniz ad-hoc kodlama şemasını kullanmanızı ve encodeURIComponent
makul bir seçim olarak URL kodlamasını (JavaScript tarafından üretildiği gibi) önermenizi ister .
Gerçek standartlar açısından, çerez davranışını kodlamak için birkaç girişim olmuştur, ancak şimdiye kadar hiçbiri gerçek dünyayı yansıtmamaktadır.
RFC 2109 , orijinal Netscape cookie_spec kodunu düzeltme ve düzeltme girişimidir. Kullandığı olarak bu standart daha birçok özel karakterler olarak, izin verilmeyen RFC 2616 belirteçleri (a -
edilir hala orada izin verilir) ve sadece değer diğer karakterler ile bir alıntı-string belirtilebilir. Hiçbir tarayıcı sınırlamaları, alıntılanan dizelerin ve kaçmanın özel işlenmesini veya bu spesifikasyondaki yeni özellikleri uygulamadı.
RFC 2965 , 2109'u toplayarak ve 'sürüm 2 çerezleri' şeması altında daha fazla özellik ekleyerek başka bir şeydi. Hiç kimse de bunlardan hiçbirini uygulamadı. Bu özellik, önceki sürümle aynı jeton ve alıntılanan dize sınırlamalarına sahiptir ve bu da bir saçmalık yüküdür.
RFC 6265 , tarihi karmaşayı temizlemek için HTML5 dönemli bir girişimdir. Hala gerçekle tam olarak eşleşmiyor, ancak önceki girişimlerden çok daha iyi - tarayıcıların desteklediği en azından uygun bir alt kümedir, çalışması gereken ancak söz konusu olmayan (önceki alıntılanan dize gibi) herhangi bir sözdizimi getirmiyor .
6265'te çerez adı hala bir RFC 2616 olarak belirtilir token
, bu da alfanum plus'tan seçim yapabileceğiniz anlamına gelir:
!#$%&'*+-.^_`|~
Çerez değerinde (tarayıcılar tarafından filtrelenmiş) kontrol karakterlerini ve (tutarsız olarak uygulanan) ASCII olmayan karakterleri resmi olarak yasaklar. Cookie_spec'in boşluk, virgül ve noktalı virgül üzerindeki yasağını korur, ayrıca önceki RFC'leri gerçekten uygulayan kötü aptallarla uyumluluk için, tüm değeri saran tırnaklar dışında ters eğik çizgi ve tırnak işareti de yasakladı (ancak bu durumda tırnak işaretleri hala bir parçası olarak kabul edilir) değer, bir kodlama şeması değil). Böylece sizi alfanum plus ile birlikte bırakırsınız:
!#$%&'()*+-./:<=>?@[]^_`{|}~
Gerçek dünyada hala orijinal ve en kötü Netscape cookie_spec'i kullanıyoruz, bu yüzden çerezleri tüketen kod hemen hemen her şeyle karşılaşmaya hazırlanmalı, ancak çerez üreten kod için RFC 6265'teki alt kümeye bağlı kalmanız önerilir.
;
çift tırnak işareti içine alındığı sürece karaktere sahip olabileceğini mi ifade ediyor ? Bu şekilde:Set-Cookie: Name=Va";"lue; Max-Age=3600