如何解决cookie 中允许使用哪些字符?
根据古老的 netscapecookie_spec,整个NAME=VALUE
字符串是:
不包括分号、逗号和空格的字符序列。
所以-
应该可以工作,而且在我这里的浏览器中似乎还可以;你在哪里遇到问题?
综上所述:
没有提到什么,因为 netscape 在编写规范方面很糟糕,但似乎一直受到浏览器的支持:
-
NAME 或 VALUE 可能是空字符串
-
如果字符串中根本没有
=
符号,浏览器会将其视为具有空字符串名称的 cookie,即Set-Cookie: foo
与Set-Cookie: =foo
. -
当浏览器输出一个空名称的 cookie 时,它们会省略等号。所以
Set-Cookie: =bar
产生Cookie: bar
。 -
名称和值中的逗号和空格似乎确实有效,尽管等号周围的空格被修剪了
-
不允许使用控制字符(
\x00
加\x1F
号)\x7F
没有提到和浏览器完全不一致的是非 ASCII (Unicode) 字符:
- 在 Opera 和 Google Chrome 中,它们使用 UTF-8 编码为 Cookie 标头;
- 在 IE 中,使用机器的默认代码页(特定于区域设置,从不使用 UTF-8);
- Firefox(和其他基于 Mozilla 的浏览器)自己使用每个 UTF-16 代码点的低字节(因此 ISO-8859-1 是可以的,但其他任何东西都会被破坏);
- Safari 只是拒绝发送任何包含非 ASCII 字符的 cookie。
所以实际上你根本不能在 cookie 中使用非 ASCII 字符。如果您想使用 Unicode、控制代码或其他任意字节序列,cookie_spec
要求您使用您自己选择的 ad-hoc 编码方案,并建议 URL 编码(由 JavaScript
生成encodeURIComponent
)作为合理的选择。
就 实际 标准而言,已经有一些尝试对 cookie 行为进行编码,但到目前为止还没有一个真正反映现实世界。
-
RFC 2109试图编纂和修复原始的 netscape cookie_spec。在这个标准中,更多的特殊字符是不允许的,因为它使用RFC 2616标记(a
-
仍然允许 在 那里),并且只有值可以在带有其他字符的带引号的字符串中指定。没有浏览器实现过限制、引用字符串的特殊处理和转义,或本规范中的新功能。 -
RFC 2965是另一个尝试,整理 2109 并在“版本 2 cookie”方案下添加更多功能。也没有人实施过任何一个。该规范与早期版本具有相同的标记和引用字符串限制,而且它也是一堆废话。
-
RFC 6265是 HTML5 时代的一次尝试,旨在清理历史混乱。它仍然不完全符合现实,但它比早期的尝试要好得多——至少是浏览器支持的一个适当的子集,没有引入任何应该工作但没有工作的语法(就像前面的引用字符串)。
在 6265 中,cookie 名称仍被指定为 RFC 2616 token
,这意味着您可以从字母加号中进行选择:
!#$%&'*+-.^_`|~
在 cookie 值中,它正式禁止(由浏览器过滤)控制字符和(不一致实现的)非 ASCII 字符。它保留了 cookie_spec 对空格、逗号和分号的禁止,并且为了与实际实施早期 RFC 的任何可怜的白痴兼容,它还禁止反斜杠和引号,除了包含整个值的引号(但在这种情况下,引号仍然被认为是值,而不是编码方案)。这样就可以为您留下字母加:
!#$%&'()*+-./:<=>?@[]^_`{|}~
在现实世界中,我们仍在使用原始且最差的 netscape cookie_spec,因此使用 cookie 的代码应该准备好遇到几乎任何事情,但对于产生 cookie 的代码,建议坚持使用 RFC 6265 中的子集。
解决方法
cookie 名称和值中允许使用哪些字符?它们与 URL 或某些公共子集相同吗?
我问的原因是我最近遇到了一些奇怪的行为,-
他们的名字中有 cookie,我只是想知道这是浏览器特定的东西还是我的代码有问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。