Go:如何不删除cookie上的双引号

ecbunoof  于 2022-12-07  发布在  Go
关注(0)|答案(2)|浏览(381)

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 )
  • Go语言目前有一个条件to insert double quote into cookies,所以显然允许使用双引号。
  • ;是Cookie分隔符。
  • ASCII字符超出限定ASCII范围的值可以用引号括起来(RFC将其称为quoted_string),这扩展了允许的字符集。
  • JSON不包含;字符,因此;只能出现在字符串值中。在JSON中,字符串值已经用引号括起来。
  • 我已经确认了使用一个简单的k:v JSON负载进行的测试,它在所有主要浏览器上都工作正常,没有任何问题。
  • Cookie通常由服务器数据生成,而不是由用户数据生成。这意味着可以使用结构良好的JSON,而不是任意的

JSON可以很容易地符合cookie RFC。此外,尽管这不是JSON示例的问题,但关于不符合RFC的假设问题:

  • Cookie以HTTP标头的形式传输。许多HTTP标头通常会忽略RFC。例如,Chrome创建的Sec-Ch-Ua标头包含多个“错误”字符。

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

  • “逗号”是“不允许的”,它一直在使用。
  • 即使双引号是“错误的”,事实上它们并不是,但是如果它们是错误的,那么有很多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

其中可以看到whitespace DQUOTE是不允许的,而DQUOTE是允许的。

r9f1avp5

r9f1avp51#

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

vyswwuz2

vyswwuz22#

。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规则始终被忽略,especially commas。例如,Chrome设置了以下头:

Sec-Ch-Ua: "Google Chrome";v="107", "Chromium";v="107", "Not=A?Brand";v="24"

Gasp!Is使用逗号和其他东西!It is well established that commas in HTTP headers are okay,尽管RFC似乎另有说明。
请注意,Chrome的标头使用了空格、许多双引号、逗号、特殊字符和分号。Chrome在这里使用了双引号来括住许多需要转义的值,这是符合RFC的正确方法。
请注意,cookie RFC 6265是一个 * 提案 *,已经有11年了。这是有原因的。知道cookie只是一个HTTP头,请查看接受的HTTP RFC,以了解头值的引用字符串语义:
HTTP RFC 7230第3.2.6节.
quoted-string包含以下字符:
第一章:中国共产党第一次全国代表大会〈=〉?@@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_'abcdefghijklmNOPQRSTUVWxyz{|}~ %x80-全帧
如果进行转义,则可以包含字符“和/。

相关问题