微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

cookie 中允许使用哪些字符?

如何解决cookie 中允许使用哪些字符?

根据古老的 netscapecookie_spec,整个NAME=VALUE字符串是:

包括分号、逗号和空格的字符序列。

所以-应该可以工作,而且在我这里的浏览器中似乎还可以;你在哪里遇到问题?

综上所述:

  • =包含在内是合法的,但可能会模棱两可。浏览器总是在字符串的第一个符号上拆分名称和值=,因此实际上您可以=在 VALUE 中放置符号,但不能在 NAME 中放置符号。

没有提到什么,因为 netscape 在编写规范方面很糟糕,但似乎一直受到浏览器的支持

  • NAME 或 VALUE 可能是空字符串

  • 如果字符串中根本没有=符号,浏览器会将其视为具有空字符串名称的 cookie,即Set-Cookie: fooSet-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 举报,一经查实,本站将立刻删除。