Đây là một quickie:
Bạn có thể nghĩ rằng nó nên, nhưng thực sự nó không phải là tất cả!
Các ký tự được phép trong cả tên và giá trị cookie là gì?
Theo cookie_spec cổ của Netscape , toàn bộ NAME=VALUE
chuỗi là:
một chuỗi các ký tự không bao gồm dấu chấm phẩy, dấu phẩy và khoảng trắng.
Vì vậy, -
nên hoạt động, và nó có vẻ ổn trong các trình duyệt tôi đã có ở đây; bạn gặp rắc rối với nó ở đâu?
Theo ngụ ý của những điều trên:
=
là hợp pháp để bao gồm, nhưng có khả năng mơ hồ. Các trình duyệt luôn phân chia tên và giá trị trên =
biểu tượng đầu tiên trong chuỗi, vì vậy trong thực tế, bạn có thể đặt một =
biểu tượng trong GIÁ TRỊ chứ không phải TÊN.
Những gì không được đề cập, bởi vì Netscape rất tệ trong việc viết thông số kỹ thuật, nhưng dường như được các trình duyệt hỗ trợ một cách nhất quán:
TÊN hoặc GIÁ TRỊ có thể là các chuỗi trống
nếu không có =
ký hiệu nào trong chuỗi, các trình duyệt coi nó là cookie với tên chuỗi rỗng, nghĩa Set-Cookie: foo
là giống như Set-Cookie: =foo
.
khi các trình duyệt xuất một cookie có tên trống, chúng sẽ bỏ qua dấu bằng. Vì vậy, Set-Cookie: =bar
sinh ra Cookie: bar
.
dấu phẩy và khoảng trắng trong tên và giá trị thực sự có vẻ hoạt động, mặc dù khoảng trắng xung quanh dấu bằng được cắt bớt
ký tự điều khiển ( \x00
để \x1F
cộng \x7F
) không được phép
Những gì không được đề cập và trình duyệt hoàn toàn không nhất quán, là các ký tự không phải ASCII (Unicode):
- trong Opera và Google Chrome, chúng được mã hóa thành các tiêu đề Cookie với UTF-8;
- trong IE, trang mã mặc định của máy được sử dụng (cụ thể theo địa phương và không bao giờ UTF-8);
- Firefox (và các trình duyệt dựa trên Mozilla khác) sử dụng byte thấp của từng điểm mã UTF-16 (vì vậy ISO-8859-1 vẫn ổn nhưng mọi thứ khác đều bị sai lệch);
- Safari chỉ từ chối gửi bất kỳ cookie nào chứa các ký tự không phải ASCII.
vì vậy trong thực tế, bạn không thể sử dụng các ký tự không phải ASCII trong cookie. Nếu bạn muốn sử dụng Unicode, mã điều khiển hoặc các chuỗi byte tùy ý khác, cookie_spec yêu cầu bạn sử dụng sơ đồ mã hóa đặc biệt do chính bạn chọn và đề xuất mã hóa URL (do JavaScript tạo ra encodeURIComponent
) như một lựa chọn hợp lý.
Về các tiêu chuẩn thực tế , đã có một vài nỗ lực để mã hóa hành vi cookie nhưng không có gì thực sự phản ánh thế giới thực.
RFC 2109 là một nỗ lực để mã hóa và sửa lỗi Netscape cookie_spec ban đầu. Trong tiêu chuẩn nhiều ký tự đặc biệt hơn này là không được phép, vì nó sử dụng RFC 2616 tokens (một -
là vẫn cho phép có), và chỉ có giá trị có thể được quy định trong một trích dẫn dây với các nhân vật khác. Không có trình duyệt nào từng thực hiện các giới hạn, xử lý đặc biệt các chuỗi được trích dẫn và thoát hoặc các tính năng mới trong thông số này.
RFC 2965 là một hướng đi khác, thu dọn 2109 và bổ sung thêm nhiều tính năng theo sơ đồ 'cookie phiên bản 2'. Không ai từng thực hiện bất kỳ điều đó. Thông số kỹ thuật này có các giới hạn chuỗi mã thông báo và trích dẫn giống như phiên bản trước đó và nó cũng chỉ là một tải vô nghĩa.
RFC 6265 là một nỗ lực trong thời đại HTML5 để dọn dẹp mớ hỗn độn lịch sử. Nó vẫn không khớp chính xác với thực tế nhưng nó tốt hơn nhiều so với những lần thử trước đó, ít nhất nó là một tập hợp con phù hợp với những gì trình duyệt hỗ trợ, không đưa ra bất kỳ cú pháp nào được cho là hoạt động nhưng không (như chuỗi trích dẫn trước đó) .
Trong 6265, tên cookie vẫn được chỉ định là RFC 2616 token
, có nghĩa là bạn có thể chọn từ các chữ cái và chữ cái cộng:
!#$%&'*+-.^_`|~
Trong giá trị cookie, nó chính thức cấm các ký tự điều khiển (được lọc bởi trình duyệt) và các ký tự không phải ASCII (được triển khai không nhất quán). Nó giữ lại sự cấm đoán của cookie_spec đối với không gian, dấu phẩy và dấu chấm phẩy, cộng với việc tương thích với bất kỳ kẻ ngốc nào thực sự thực hiện các RFC trước đó, nó cũng cấm dấu gạch chéo ngược và trích dẫn, ngoài các trích dẫn bao gồm toàn bộ giá trị (nhưng trong trường hợp đó, các trích dẫn vẫn được coi là một phần của giá trị, không phải là sơ đồ mã hóa). Vì vậy, để lại cho bạn các chữ và số cộng:
!#$%&'()*+-./:<=>?@[]^_`{|}~
Trong thế giới thực, chúng ta vẫn đang sử dụng cookie_spec Netscape ban đầu và tồi tệ nhất, do đó, mã tiêu thụ cookie nên được chuẩn bị để gặp khá nhiều thứ, nhưng đối với mã tạo ra cookie, nên sử dụng tập hợp con trong RFC 6265.
;
ký tự miễn là nó được bao quanh bởi dấu ngoặc kép? Như vậy:Set-Cookie: Name=Va";"lue; Max-Age=3600