无论后端平台如何,我都很难弄清楚编码/解码 cookie 值的标准是什么(或者有什么标准?)。
根据RFC 2109:
VALUE 对用户代理是不透明的,可以是源服务器选择发送的任何内容,可能是服务器选择的可打印 ASCII 编码。“不透明”意味着内容仅对原始服务器感兴趣和相关。事实上,任何检查 Set-Cookie 标头的人都可以读取该内容。
这听起来像“服务器是老板”,它决定了编码将适用什么。这使得从 PHP 后端设置 cookie 并从 Python 或 Java 或其他任何方式读取它变得非常困难,而无需在双方都编写任何手动编码/解码处理。
假设我们有一个需要编码的值。俄语/"печенье (*} значения"/
的意思是“cookie 值”,其中包含一些额外的非字母数字字符。
Python:
几乎每个 WSGI 服务器都这样做并使用 Python 的SimpleCookie类,该类对八进制文字进行编码/解码,尽管许多人说八进制文字在 ECMA-262 严格模式下已被贬低。什么?
因此,我们的原始 cookie 值变为"/\"\320\277\320\265\321\207\320\265\320\275\321\214\320\265 (*} \320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\"/"
节点.js:
根本没有测试过,但我只是猜测 JavaScript 后端会使用使用十六进制转义/取消转义的本机encodeURIComponent和decodeURIComponent函数来做到这一点?
PHP:
PHP 将urlencode应用于类似于encodeURIComponent但不完全相同的 cookie 值。
所以原始值变成了;%2F%22%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D1%8C%D0%B5+%28%2A%7D+%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%22%2F
这甚至没有用双引号括起来。
然而; 如果 JavaScriptvalue
变量具有上面的 PHP 编码值,decodeURIComponent(value)
则给出/"печенье+(*}+значения"/
,请参阅“+”字符而不是空格。
Java、Ruby、Perl 和 .NET 的情况如何?哪种语言遵循(或最接近)期望的行为。实际上,W3对此是否有任何标准?