Go 删除 cookie 中的双引号。有没有办法在 Go 中的 cookie 中保留双引号?
例如,我发送一条小型 JSON 消息,“SetCookie”去掉双引号。
w.SetCookie("my_cookie_name", small_json_message)
有关 Cookie 的更多信息:
HTTP RFC 定义带引号的字符串值。请参阅https://www.rfc-editor.org/rfc/rfc7230#section-3.2.6
提议的 cookie RFC 明确规定 cookie 值中允许使用双引号:
cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )
;
是 cookie 分隔符。
可以引用超出有限 ASCII 范围的 ASCII 字符值(RFC 称之为
quoted_string
),这扩展了允许的字符集。
JSON 不包含
;
字符,因此 ;
出现在 JSON 中只能出现在字符串值中。在 JSON 中,字符串值已被引用。
我已经确认使用简单的 k:v JSON 有效负载进行了测试,它在所有主要浏览器上都能正常工作,没有任何问题。当然,有效负载不能是任意的,并且必须限制为cookie。
Cookie 通常由服务器数据生成,而不是由用户数据生成。这意味着可以使用结构良好的 JSON,而不是任意的
Go 目前有一个条件 在 cookies 中插入双引号。
JSON 可以轻松符合 cookie RFC。此外,尽管这个 JSON 示例不是问题,但关于不符合 RFC 的假设问题:
Sec-Ch-Ua
标头包含几个“坏”字符。Sec-Ch-Ua: "Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"
作为参考,这里是 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
是允许的。
例如,来自 RFC 的作者,
Set-Cookie: foo="bar"
结果是一个 cookie
Cookie: foo="bar"
34
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
)。
请参阅此问题以获取更多信息。
是的。 cookie 和其他 HTTP 标头中允许使用双引号。双引号还用于转义否则无效的字符。
这里有一种手动设置cookie的方法,其中
w
是http.responseWriter,b
是cookie的字节。 Max-Age 以秒为单位,999999999 约为 31.69 岁。
w.Header().Set("Set-Cookie", "your_cookie_name="+string(b)+"; Path=/; Domain=localhost; Secure; Max-Age=999999999; SameSite=Strict")
由于您可能会使用 cURL 来测试向服务器发送 cookie,因此这里有一个有用的测试:
curl --insecure --cookie 'test1={"test1":"v1"}; test2={"test2":"v2"}' https://localhost:8081/
这会产生如下所示的 HTTP 标头:
GET / HTTP/2.0
Host: localhost:8081
Accept: */*
Cookie: test1={"test1":"v1"}; test2={"test2":"v2"}
User-Agent: curl/7.0.0
虽然这里的情况并非如此,并且上述内容符合 RFC,但许多 RFC 规则始终被忽略,尤其是逗号。例如,Chrome 设置此标头:
Sec-Ch-Ua: "Google Chrome";v="107", "Chromium";v="107", "Not=A?Brand";v="24"
喘气!是使用逗号和其他东西! 众所周知,HTTP 标头中的逗号是可以的,尽管 RFC 似乎另有规定。
请注意,Chrome 标头使用空格、许多双引号、逗号、特殊字符和分号。 Chrome 在这里对许多需要转义的值使用双引号,这是符合 RFC 的正确方法。
请注意,cookie RFC 6265 是一项“提案”,已经存在 11 年了。这是有原因的。知道 cookie 只是一个 HTTP 标头,请查看已接受的 HTTP RFC,了解标头值的带引号字符串语义:
HTTP RFC 7230 3.2.6。quoted-string
:
HTAB,SP !#$%&'()*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~ %x80-FF<=>如果转义,可能会包含字符“和/。