首页 文章

Cookie中允许的字符

提问于
浏览
275

这个是一个快速的:

cookie名称和值中允许的字符是什么?它们与URL或某些常见子集相同吗?

原因我最近发现了一些奇怪的行为,因为他们的名字中有 - ,而且我的代码是特定的,或者我的代码有问题 .

9 回答

  • -1

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

  • 28

    IE和Edge还有另一个有趣的问题 . 名称超过1个周期的Cookie似乎会被默默地删除 . 这样可行:

    cookie_name_a = valuea

    虽然这会被放弃

    cookie.name.a = valuea

  • 9

    多年前MSIE 5或5.5(可能两者)在HTML块中有一个“ - ”的严重问题,如果你能相信的话 . 虽然它没有直接相关,因为我们已经在cookie中存储了MD5哈希(仅包含字母和数字)以查找服务器端数据库中的所有其他内容 .

  • 1

    这个是快速的:

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

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

    根据古代网景cookie_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令牌(仍允许 - ),并且只能在带有其他字符的带引号的字符串中指定值 . 没有浏览器实现过限制,引用字符串和转义的特殊处理,或者本规范中的新功能 .

    • RFC 2965是另一回事,整理2109并在'版本2 cookie'方案下添加更多功能 . 也没有人实施任何一项 . 此规范具有与早期版本相同的令牌和引用字符串限制,并且同样是一堆废话 .

    • RFC 6265是一个HTML5时代的尝试,以清理历史混乱 . 它仍然没有比早期的尝试好得多 - 它至少是浏览器支持的适当子集,而不是引入任何应该起作用但不起作用的语法(就像之前的引用字符串一样) .

    在6265中,cookie名称仍被指定为RFC 2616 token ,这意味着您可以从alphanums中选择加:

    !#$%&'*+-.^_`|~
    

    在cookie值中,它正式禁止(通过浏览器过滤)控制字符和(不一致地实现的)非ASCII字符 . 它保留了cookie_spec对空格,逗号和分号的禁止,以及与实际实现早期RFC的任何可怜的白痴的兼容性,它还禁止反斜杠和引号,除了包含整个值的引号(但在这种情况下,引号仍然被认为是值,而不是编码方案) . 因此,您可以使用alphanums plus:

    !#$%&'()*+-./:<=>?@[]^_`{|}~
    

    在现实世界中,我们仍在使用原始和最差的Netscape cookie_spec,因此使用cookie的代码应该准备好几乎遇到任何事情,但对于生成cookie的代码,建议坚持使用RFC 6265中的子集 .

  • 8

    在ASP.Net中,您可以使用 System.Web.HttpUtility 在写入cookie之前安全地编码cookie值,并在读取时将其转换回原始格式 .

    // Encode
    HttpUtility.UrlEncode(cookieData);
    
    // Decode
    HttpUtility.UrlDecode(encodedCookieData);
    

    这将停止&符号和等号,在将值写入cookie时将值拆分为一堆名称/值对 .

  • 5

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

  • 356

    在这里, in as few words as possible . 专注于不需要转义的角色:

    对于cookies:

    abdefghijklmnqrstuvxyzABDEFGHIJKLMNQRSTUVXYZ0123456789!#$%&'()*+-./:<>?@[]^_`{|}~
    

    对于网址

    abdefghijklmnqrstuvxyzABDEFGHIJKLMNQRSTUVXYZ0123456789.-_~!$&'()*+,;=:@
    

    Cookies 和网址(交叉口)

    abdefghijklmnqrstuvxyzABDEFGHIJKLMNQRSTUVXYZ0123456789!$&'()*+-.:@_~
    

    这就是你的回答 .

    请注意,对于cookie,=已被删除,因为它通常用于设置cookie值 .

    对于网址,保留了= . 交叉点显然没有 .

    var chars = "abdefghijklmnqrstuvxyz"; chars += chars.toUpperCase() + "0123456789" + "!$&'()*+-.:@_~";
    

    Turns out escaping still occuring and unexpected happening, especially in a Java cookie environment where the cookie is wrapped with double quotes if it encounters the last characters.

    所以为了安全起见,只需使用A-Za-z1-9即可 . 这就是我要做的 .

  • 16

    更新rfc6265于2011年4月发布:

    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
    

    如果你看 @bobince 回答你看到更新的限制更严格 .

  • 1

    你不能把“;”在cookie的value字段中,将设置的名称是“;”之前的字符串在大多数浏览器...

相关问题