【发布时间】:2013-02-09 22:25:28
【问题描述】:
无论后端平台如何,我都很难弄清楚编码/解码 cookie 值的标准是什么(或者有什么标准?)。
根据RFC 2109:
VALUE 对用户代理是不透明的,可以是源服务器选择发送的任何内容,可能是服务器选择的可打印 ASCII 编码。 “不透明”意味着内容仅对原始服务器感兴趣和相关。事实上,任何检查 Set-Cookie 标头的人都可以读取内容。
这听起来像“服务器是老板”,它决定了编码的应用。这使得从 PHP 后端设置 cookie 并从 Python 或 Java 或其他任何方式读取它变得非常困难,而无需在双方都编写任何手动编码/解码处理。
假设我们有一个需要编码的值。俄语 /"печенье (*} значения"/ 表示“cookie 值”,其中包含一些额外的非字母数字字符。
Python:
几乎每个 WSGI 服务器都这样做,并使用 Python 的 SimpleCookie 类从 octal literals 编码/解码,尽管许多人说在 ECMA-262 严格模式下 octal literals are depreciated。怎么回事?
所以,我们的原始 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\"/"
Node.js:
根本没有测试过,但我只是猜测 JavaScript 后端会使用使用 hexadecimal 转义/取消转义的原生 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 甚至没有用双引号括起来。
但是;如果 JavaScript value 变量具有上述 PHP 编码值,decodeURIComponent(value) 将给出 /"печенье+(*}+значения"/,请参见“+”字符而不是空格。
Java、Ruby、Perl 和 .NET 的情况如何?哪种语言遵循(或最接近)期望的行为。实际上,W3对此有定义吗?
【问题讨论】:
标签: cookies encoding language-agnostic decoding web-standards