ini quickie:
Anda mungkin berpikir itu seharusnya, tetapi sebenarnya tidak sama sekali!
Apa saja karakter yang diizinkan dalam nama dan nilai cookie?
Menurut cookie_spec Netscape kuno seluruh NAME=VALUE
string adalah:
urutan karakter tidak termasuk titik koma, koma, dan spasi putih.
Jadi -
seharusnya bekerja, dan sepertinya OK di browser saya sudah sampai di sini; di mana Anda mengalami masalah dengan itu?
Dengan implikasi dari hal di atas:
=
legal untuk dimasukkan, tetapi berpotensi ambigu. Browser selalu membagi nama dan nilai pada =
simbol pertama dalam string, jadi dalam praktiknya Anda dapat menempatkan =
simbol di VALUE tetapi tidak pada NAME.
Apa yang tidak disebutkan, karena Netscape sangat buruk dalam menulis spesifikasi, tetapi tampaknya secara konsisten didukung oleh browser:
NAME atau VALUE mungkin berupa string kosong
jika tidak ada =
simbol dalam string sama sekali, browser memperlakukannya sebagai cookie dengan nama string-kosong, yaitu Set-Cookie: foo
sama dengan Set-Cookie: =foo
.
ketika browser menampilkan cookie dengan nama kosong, mereka menghilangkan tanda sama dengan. Jadi Set-Cookie: =bar
pinta Cookie: bar
.
koma dan spasi dalam nama dan nilai tampaknya benar-benar berfungsi, meskipun ruang di sekitar tanda sama dipangkas
kontrol karakter ( \x00
ke \x1F
plus \x7F
) tidak diizinkan
Yang tidak disebutkan dan peramban yang sepenuhnya tidak konsisten adalah karakter non-ASCII (Unicode):
- di Opera dan Google Chrome, mereka dikodekan ke header Cookie dengan UTF-8;
- di IE, halaman kode default mesin digunakan (khusus lokal dan tidak pernah UTF-8);
- Firefox (dan browser berbasis Mozilla lainnya) menggunakan byte rendah dari masing-masing titik kode UTF-16 sendiri (jadi ISO-8859-1 tidak apa-apa tetapi yang lainnya hancur);
- Safari menolak untuk mengirim cookie apa pun yang mengandung karakter non-ASCII.
jadi dalam praktiknya Anda tidak dapat menggunakan karakter non-ASCII di cookie sama sekali. Jika Anda ingin menggunakan Unicode, kode kontrol atau urutan byte sewenang-wenang lainnya, cookie_spec menuntut Anda menggunakan skema pengkodean ad-hoc yang Anda pilih sendiri dan menyarankan pengkodean URL (seperti yang diproduksi oleh JavaScript encodeURIComponent
) sebagai pilihan yang wajar.
Dalam hal standar aktual , ada beberapa upaya untuk menyusun perilaku cookie, tetapi sejauh ini tidak ada yang benar-benar mencerminkan dunia nyata.
RFC 2109 adalah upaya untuk mengkodifikasi dan memperbaiki cookie_spec Netscape asli. Dalam standar ini banyak karakter khusus lagi yang dianulir, karena menggunakan RFC 2616 token (a -
adalah masih diperbolehkan ada), dan hanya nilai dapat ditentukan dalam dikutip-string dengan karakter lain. Tidak ada browser yang menerapkan batasan, penanganan khusus dari string dan pelarian yang dikutip, atau fitur baru dalam spesifikasi ini.
RFC 2965 lain dalam hal ini, merapikan 2109 dan menambahkan lebih banyak fitur di bawah skema 'cookie versi 2'. Tidak ada yang pernah menerapkan semua itu. Spesifikasi ini memiliki batasan token-dan-dikutip-string yang sama dengan versi sebelumnya dan itu sama banyaknya dengan omong kosong.
RFC 6265 adalah upaya HTML5-era untuk membersihkan kekacauan sejarah. Itu masih tidak cocok dengan kenyataan, tetapi itu jauh lebih baik daripada upaya sebelumnya — itu setidaknya bagian yang tepat dari apa yang didukung browser, tidak memperkenalkan sintaks yang seharusnya berfungsi tetapi tidak (seperti string yang dikutip sebelumnya) .
Di 6265 nama cookie masih ditentukan sebagai RFC 2616 token
, yang berarti Anda dapat memilih dari alfanumer plus:
!#$%&'*+-.^_`|~
Dalam nilai cookie itu secara formal melarang karakter kontrol (difilter oleh browser) dan (non-ASCII karakter) yang diimplementasikan. Ini mempertahankan larangan cookie_spec pada ruang, koma, dan titik koma, ditambah untuk kompatibilitas dengan orang idiot miskin yang benar-benar menerapkan RFC sebelumnya, ia juga melarang backslash dan kutipan, selain dari kutipan yang membungkus seluruh nilai (tetapi dalam hal itu kutipan masih dianggap sebagai bagian dari nilai, bukan skema penyandian). Sehingga meninggalkan Anda dengan alfanumer plus:
!#$%&'()*+-./:<=>?@[]^_`{|}~
Di dunia nyata kita masih menggunakan Netscape cookie_spec asli-dan-terburuk, jadi kode yang mengkonsumsi cookie harus siap menghadapi banyak hal, tetapi untuk kode yang menghasilkan cookie disarankan untuk tetap menggunakan subset di RFC 6265.
;
karakter selama dikelilingi oleh tanda kutip ganda? Dengan demikian:Set-Cookie: Name=Va";"lue; Max-Age=3600