cookie名称和值中允许的字符是什么?它们与URL或某个公共子集相同吗?
我问的原因是,我最近遇到了一些奇怪的行为与cookie有-在他们的名字,我只是想知道这是特定于浏览器或我的代码是错误的。
cookie名称和值中允许的字符是什么?它们与URL或某个公共子集相同吗?
我问的原因是,我最近遇到了一些奇怪的行为与cookie有-在他们的名字,我只是想知道这是特定于浏览器或我的代码是错误的。
当前回答
如果你稍后使用变量,你会发现像path这样的东西实际上会让重音字符通过,但它实际上并不匹配浏览器路径。为此,您需要对它们进行URIEncode。比如这样:
const encodedPath = encodeURI(myPath);
document.cookie = `use_pwa=true; domain=${location.host}; path=${encodedPath};`
因此,“允许的”字符可能比规范中规定的要多。但为了安全起见,您应该遵守规范,并使用uri编码的字符串。
其他回答
IE和Edge还有一个有趣的问题。名称中包含超过1个句点的cookie似乎会被无声地删除。 所以 如此:
cookie_name_a = valuea
而这个会被放弃
cookie.name.a = valuea
几年前,MSIE 5或5.5(可能两者都有)在HTML块中有一些严重的“-”问题,如果你能相信的话。虽然它没有直接的关系,但自从我们在cookie中存储了一个MD5散列(只包含字母和数字)来查找服务器端数据库中的所有其他内容以来。
这是简单的:
A <cookie-name> can be any US-ASCII characters except control characters (CTLs), spaces, or tabs. It also must not contain a separator character like the following: ( ) < > @ , ; : \ " / [ ] ? = { }. A <cookie-value> can optionally be set in double quotes and any US-ASCII characters excluding CTLs, whitespace, double quotes, comma, semicolon, and backslash are allowed. Encoding: Many implementations perform URL encoding on cookie values, however it is not required per the RFC specification. It does help satisfying the requirements about which characters are allowed for though.
链接:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie指令
最后我用了
cookie_value = encodeURIComponent(my_string);
and
my_string = decodeURIComponent(cookie_value);
这似乎对各种角色都适用。除此之外,我还遇到了一些奇怪的问题,即使是那些不是分号或逗号的字符。
在这里,尽可能简短地说。专注于那些不需要逃跑的角色:
For cookie:
abdefghijklmnqrstuvxyzABDEFGHIJKLMNQRSTUVXYZ0123456789!#$%&'()*+-./:<>?@[]^_`{|}~
为url
abdefghijklmnqrstuvxyzABDEFGHIJKLMNQRSTUVXYZ0123456789.-_~!$&'()*+,;=:@
对于cookie和url(交集)
abdefghijklmnqrstuvxyzABDEFGHIJKLMNQRSTUVXYZ0123456789!$&'()*+-.:@_~
这就是你的回答。
注意,对于cookie, =已被删除,因为它是 通常用于设置cookie值。
对于url this the =被保留。十字路口显然没有。
var chars = "abdefghijklmnqrstuvxyz"; chars += chars.toUpperCase() + "0123456789" + "!$&'()*+-.:@_~";
事实证明,转义仍然会发生,而且还会发生意想不到的情况,特别是在Java cookie环境中,如果遇到最后一个字符,cookie就会用双引号包装。
安全起见,就用A-Za-z1-9。这就是我要做的。