问题描述
Go 删除了 cookie 中的双引号。分隔符似乎是分号加空格。即使双引号是“错误的”,也有很多包含引号的 cookie 示例。
如何在 Go 中的 cookie 中放置双引号?
例如,我正在发送一个小的 JSON 消息,Go 正在杀死作为我的 cookie。 “SetCookie”去掉双引号。
w.SetCookie("my_cookie_name",small_json_message)
还有:
-
;
是规定的 cookie 分隔符。 -
RFC 明确指出 cookie 值中允许使用双引号:
cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )
-
RFC 没有说
DQUOTE
在 cookie 中的其他地方无效(参见第 1 点),而是说whitespace DQUOTE
无效。压缩的 JSON 字符串或约束良好的 JSON 字符串不会出现此问题。 -
cookie 是通过 HTTP 标头传输的,它在服务器和客户端之间通信时是一个 HTTP 标头。许多 HTTP 标头通常会“破坏”RFC。例如,这里有一个
Sec-Ch-Ua
标头,其中包含几个“坏”字符:
Sec-Ch-Ua:["Chromium";v="92"," Not A;Brand";v="99","Google Chrome";v="92"]
- 是的,我不会使用“任意 JSON”作为 cookie,但如果您的 JSON 定义明确且不包含
;
,那么应该不会有任何问题。 - 我已经使用一个小的、简单的 k:v json 负载完成了测试,它在主要浏览器上运行良好,没有任何问题。
- “逗号”是不允许的,它一直被使用。
解决方法
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
定义为 double quote
)。
有关详细信息,请参阅 this issue。
,这是一种手动设置 cookie 的方法,其中 w
是 http.responseWriter,b
是 cookie 的字节数。
w.Header().Set("Set-Cookie","your_cookie_name="+string(b)+"; Path=/; Domain=localhost; Secure; SameSite=Strict")