首页 > 解决方案 > Go:如何不删除 cookie 上的双引号

问题描述

Go 删除​​ cookie 中的双引号。有没有办法在 Go 中的 cookie 中保留双引号?

例如,我正在发送一条小的 JSON 消息,并且“SetCookie”去掉了双引号。

w.SetCookie("my_cookie_name", small_json_message)

更多关于 Cookie 的信息:

  1. ; 是规定的 cookie 分隔符。

  2. RFC 明确规定 cookie 值中允许使用双引号:cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )

  3. 如果 JSON 字符串不包含该字符;并被压缩,则不会有任何问题。没有分号的附加约束没什么大不了的,可以很容易地转义或删除。

  4. 我已经确认使用简单的 k:v JSON 有效负载进行了测试,它在所有主要浏览器上都可以正常运行,没有任何问题。

  5. RFC 并没有说DQUOTEcookie 在其他地方是无效的(第 1 点),它说whitespace DQUOTE不仅仅是DQUOTE是无效的。 压缩的 JSON 字符串没有这个问题

  6. Cookie 通常由服务器数据而非用户数据生成。我建议不要使用任意 JSON,比如用户生成的 JSON,作为 cookie。

JSON 很容易符合 cookie RFC。此外,即使这个 JSON 示例不是问题,关于不符合 RFC 的假设问题:

  1. cookie 作为 HTTP 标头传输。许多 HTTP 标头通常无视 RFC。例如,Sec-Ch-UaChrome 创建的标头包含几个“坏”字符。

Sec-Ch-Ua: "Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"

  1. “逗号”是“不允许的”,并且一直在使用。
  2. 即使双引号是“错误的”,但事实并非如此,但如果是的话,也有很多包含引号的 cookie 示例。

作为参考,这里是 RFC 6265 的相关部分

set-cookie-header = "Set-Cookie:" SP set-cookie-string
 set-cookie-string = cookie-pair *( ";" SP cookie-av )
 cookie-pair       = cookie-name "=" cookie-value
 cookie-name       = token
 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

可以看到的地方whitespace DQUOTE是不允许的,DQUOTE是允许的。

标签: gocookiesdouble-quotes

解决方案


HTTP cookie 允许有双引号。

你确定吗?RFC6265状态:

set-cookie-header = "Set-Cookie:" SP set-cookie-string
set-cookie-string = cookie-pair *( ";" SP cookie-av )
cookie-pair       = cookie-name "=" cookie-value
cookie-name       = token
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

因此,Go 似乎遵循规范(规范之前定义DQUOTE为 mean double quote)。

有关详细信息,请参阅此问题


推荐阅读