Cookies Cookie中允许哪些字符?

Cookies Cookie中允许哪些字符?,cookies,Cookies,cookie名称和值中允许的字符是什么?它们是与URL相同还是与某个公共子集相同 我问这个问题的原因是,我最近在cookie中遇到了一些奇怪的行为,这些cookie的名称中有-,我只是想知道这是特定于浏览器的还是我的代码有问题。我认为它通常是特定于浏览器的。为了安全起见,base64对JSON对象进行编码,并将所有内容存储在其中。这样,您只需对其进行解码并解析JSON。base64中使用的所有字符在大多数浏览器(如果不是所有浏览器的话)中都可以使用。我认为它通常是特定于浏览器的。为了安全起见,b

cookie名称和值中允许的字符是什么?它们是与URL相同还是与某个公共子集相同


我问这个问题的原因是,我最近在cookie中遇到了一些奇怪的行为,这些cookie的名称中有
-
,我只是想知道这是特定于浏览器的还是我的代码有问题。

我认为它通常是特定于浏览器的。为了安全起见,base64对JSON对象进行编码,并将所有内容存储在其中。这样,您只需对其进行解码并解析JSON。base64中使用的所有字符在大多数浏览器(如果不是所有浏览器的话)中都可以使用。

我认为它通常是特定于浏览器的。为了安全起见,base64对JSON对象进行编码,并将所有内容存储在其中。这样,您只需对其进行解码并解析JSON。base64中使用的所有字符在大多数浏览器(如果不是所有浏览器的话)中都能正常使用。

有两种版本的Cookie规范
1.版本0 cookies又名Netscape cookies,
2.版本1又名RFC 2965 cookies
在版本0中,Cookie的名称和值部分是字符序列,不包括分号、逗号、等号和空格(如果不与双引号一起使用)
版本1要复杂得多,您可以检查它

在这个版本中,名称值部分的规范几乎相同,只是名称不能以$sign开头

有两个版本的cookies规范
1.版本0 cookies又名Netscape cookies,
2.版本1又名RFC 2965 cookies
在版本0中,Cookie的名称和值部分是字符序列,不包括分号、逗号、等号和空格(如果不与双引号一起使用)
版本1要复杂得多,您可以检查它
在此版本中,名称值部分的规格几乎相同,只是名称不能以$sign开头

这个很快:

你可能认为应该是这样,但实际上根本不是这样

cookie名称和值中允许的字符是什么

根据古代的Netscape,整个
NAME=VALUE
字符串是:

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

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

根据上述含义:

  • =
    包括在内是合法的,但可能存在歧义。浏览器总是在字符串的第一个
    =
    符号上拆分名称和值,因此实际上可以在值中放置
    =
    符号,但不能在名称中放置
有什么没有提到,因为Netscape在编写规范方面很糟糕,但浏览器似乎一直支持它:

  • 名称或值可以是空字符串

  • 如果字符串中根本没有
    =
    符号,浏览器将其视为具有空字符串名称的cookie,即
    Set cookie:foo
    Set cookie:=foo
    相同

  • 当浏览器输出一个空名称的cookie时,它们会忽略等号。所以
    Set Cookie:=bar
    begets
    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_规范要求您使用自己选择的特殊编码方案,并建议URL编码(由JavaScript的
encodeURIComponent
生成)作为合理选择

就实际标准而言,有几次尝试对cookie行为进行编码,但迄今为止没有一次真正反映真实世界

  • 试图对原始Netscape cookie_规范进行编码和修复。在该标准中,不允许使用更多特殊字符,因为它使用标记(此处仍然允许使用
    -
    ),并且只能在带引号的字符串中与其他字符一起指定值。没有浏览器实现过本规范中的限制、引号字符串和转义的特殊处理或新功能

  • 这是又一次尝试,整理了2109,并在“版本2 cookies”计划下添加了更多功能。也没有人实施过这一切。此规范与早期版本具有相同的标记和引用字符串限制,并且它同样是一堆废话

  • 是HTML5时代试图清理历史混乱的尝试。它仍然不完全符合实际情况,但它比以前的尝试要好得多。它至少是浏览器支持的一个适当子集,没有引入任何应该工作但不工作的语法(如前面引用的字符串)

在6265中,cookie名称仍然指定为RFC 2616
标记,这意味着您可以从alphanums plus中选择:

!#$%&'*+-.^_`|~
!#$%&'()*+-./:<=>?@[]^_`{|}~
在cookie值中,它正式禁止(通过浏览器过滤)控制字符和(实现不一致的)非ASCII字符。它保留了cookie_规范对空格、逗号和分号的禁止,并且为了与任何实际实现早期RFC的可怜白痴兼容,它还禁止反斜杠和引号,而不是包含整个值的引号(但是
// Encode
HttpUtility.UrlEncode(cookieData);

// Decode
HttpUtility.UrlDecode(encodedCookieData);
cookie-header = "Cookie:" OWS cookie-string OWS
cookie-string = cookie-pair *( ";" SP cookie-pair )
cookie-pair  = cookie-name "=" cookie-value
cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )

cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E
                   ; US-ASCII characters excluding CTLs,
                   ; whitespace DQUOTE, comma, semicolon,
                   ; and backslash
abdefghijklmnqrstuvxyzABDEFGHIJKLMNQRSTUVXYZ0123456789!#$%&'()*+-./:<>?@[]^_`{|}~
abdefghijklmnqrstuvxyzABDEFGHIJKLMNQRSTUVXYZ0123456789.-_~!$&'()*+,;=:@
abdefghijklmnqrstuvxyzABDEFGHIJKLMNQRSTUVXYZ0123456789!$&'()*+-.:@_~
var chars = "abdefghijklmnqrstuvxyz"; chars += chars.toUpperCase() + "0123456789" + "!$&'()*+-.:@_~";
// from browser to PHP. substitute troublesome chars with 
// other cookie safe chars, or vis-versa.  

function fix64($inp) {
    $out =$inp;
    for($i = 0; $i < strlen($inp); $i++) {
        $c = $inp[$i];
        switch ($c) {
            case '+':  $c = '*'; break; // definitly won't transfer!
            case '*':  $c = '+'; break;

            case '=':  $c = ':'; break; // = symbol seems like a bad idea
            case ':':  $c = '='; break;

            default: continue;
            }
        $out[$i] = $c;
        }
    return $out;
    }
cookie_value = encodeURIComponent(my_string);
my_string = decodeURIComponent(cookie_value);
  const encodedPath = encodeURI(myPath);
  document.cookie = `use_pwa=true; domain=${location.host}; path=${encodedPath};`