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

问题描述 投票:0回答:2

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 的假设问题:

  • cookie 作为 HTTP 标头传输。许多 HTTP 标头通常忽略 RFC。例如,Chrome 创建的
    Sec-Ch-Ua
    标头包含几个“坏”字符。

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
是允许的。

例如,来自 RFC 的作者

Set-Cookie: foo="bar"
结果是一个 cookie
Cookie: foo="bar"
34

go cookies double-quotes
2个回答
2
投票

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
)。

请参阅此问题以获取更多信息。


-1
投票

是的。 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

<=>如果转义,可能会包含字符“和/。

© www.soinside.com 2019 - 2024. All rights reserved.