go - Go:如何不删除 cookie 上的双引号
问题描述
Go 删除 cookie 中的双引号。有没有办法在 Go 中的 cookie 中保留双引号?
例如,我正在发送一条小的 JSON 消息,并且“SetCookie”去掉了双引号。
w.SetCookie("my_cookie_name", small_json_message)
更多关于 Cookie 的信息:
;
是规定的 cookie 分隔符。RFC 明确规定 cookie 值中允许使用双引号:
cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )
如果 JSON 字符串不包含该字符
;
并被压缩,则不会有任何问题。没有分号的附加约束没什么大不了的,可以很容易地转义或删除。我已经确认使用简单的 k:v JSON 有效负载进行了测试,它在所有主要浏览器上都可以正常运行,没有任何问题。
RFC 并没有说
DQUOTE
cookie 在其他地方是无效的(第 1 点),它说whitespace DQUOTE
,不仅仅是,DQUOTE
是无效的。 压缩的 JSON 字符串没有这个问题。Cookie 通常由服务器数据而非用户数据生成。我建议不要使用任意 JSON,比如用户生成的 JSON,作为 cookie。
JSON 很容易符合 cookie RFC。此外,即使这个 JSON 示例不是问题,关于不符合 RFC 的假设问题:
- cookie 作为 HTTP 标头传输。许多 HTTP 标头通常无视 RFC。例如,
Sec-Ch-Ua
Chrome 创建的标头包含几个“坏”字符。
Sec-Ch-Ua: "Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"
- “逗号”是“不允许的”,并且一直在使用。
- 即使双引号是“错误的”,但事实并非如此,但如果是的话,也有很多包含引号的 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
是允许的。
解决方案
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
)。
有关详细信息,请参阅此问题。
推荐阅读
- python - 如何使用 xlsxwriter(不带熊猫)将一组列表写入 Excel?
- python - 根据 .CSV 文件中的列数据识别列名
- excel - 如何在 MS Excel 中为一行创建动态范围?
- asp.net-mvc - 如何使用状态码重定向到 MVC 控制器中的另一个 URL
- google-people-api - People API 上的持久化操作似乎比 Contacts API 上的慢得多
- isabelle - Sledgehammer 如何将 lambda 抽象转换为 ATP?
- java - 我可以在我的索引器客户端中使用 solrj 驱动程序 8.5.0 而不登录 log4j2 吗?
- oracle - 在非常大的 IN 子句上获取 ORA-00913
- scroll - 在 mosh 中,我如何在终端中回滚并在 emacs、less 等中使用鼠标
- c# - 如何动态加载和卸载(重新加载).dll 程序集