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
是允许的。
2条答案
按热度按时间r9f1avp51#
HTTP Cookie允许使用双引号。
您确定吗?rfc6265指出:
因此,Go语言似乎遵循了规范(规范之前定义
DQUOTE
的意思是double quote
)。有关详细信息,请参阅this issue。
vyswwuz22#
是。Cookie和其他HTTP标头中允许使用双引号。双引号还用于转义否则无效的字符。
这里有一个手动设置cookie的方法,其中
w
是http.responseWriter,b
是cookie的字节数。Max-Age以秒为单位,999999999大约是31.69年。由于您可能会使用cURL来测试向服务器发送Cookie,因此下面是一个有用的测试:
这会产生如下所示的HTTP标头:
另请注意,许多RFC规则始终被忽略,especially commas。例如,Chrome设置了以下头:
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-全帧
如果进行转义,则可以包含字符“和/。