根据RFC 2109,cookie的值“对用户代理是不透明的,可能是源服务器选择发送的任何内容,可能是服务器选择的可打印ASCII编码。”
因此,即使原始值相同,不同的语言/平台/服务器也会发送不同的cookie值。
例如,C#/ ASP.NET按原样发送文本;经典ASP urlencodes和urldecodes文本; Perl / Apache urlencodes / decods文本(但不同于ASP!)。 Php为您提供了选择。
我正在编写一个单点登录系统,需要与完全不同的应用程序共享一个cookie。特别是我需要支持开箱即用的.NET,Java,Perl,ColdFusion。
我存储在cookie中的文本始终是有效的ASCII-7字符串。然而,Perl喜欢编码一些7位ASCII字符,例如。
我认为有两个主要的替代方案可以做到这一点:
仅接受非编码值。毕竟,没有必要对它们进行编码。这就是目前的情况。显然,所有集成系统都必须能够支持非编码值。
接受编码和非编码值。这将允许开箱即用的最大兼容性,但我需要确定特定值是否被编码(听起来很不可能:“%20”是文字“%20”字符串还是空格?)
您会建议哪种解决方案?为什么?如果它是#2,您将如何检测UrlEncoded文本?
一个cookie的例子(我添加了换行符以使其适合)
A5A2794D694241AD92F9B22F288EFAA1|8428DCCC|20090821142732|20090821142832|
10.100.107.40|955098D50AB4982D4E247EFA53F4E23B32A05ED0131E096709BE1D8CCC
8A3CA18252D376473C244FD71C462AB42CF54C
答案 0 :(得分:3)
是的,这不是一个小问题。从根本上说,我更倾向于解决方案#2,因为这是最具互操作性的。但是,正如您所说,检测哪些cookie是URL编码以及哪些不是URL编码是一个非常重要的问题。
我想到的一件事是,您可以使用一些特殊字符来填充Cookie值的开头,这样您就可以检测Cookie是否编码。当然,这可能不会涵盖所有客户端,但例如,如果您的常规Cookie值的格式为 CookieValue1234
,那么您可以将其更改为 head :CookieValue1234
< / strong>并检查其中的空格是否会返回URL编码(即返回“%20
”或“”)。
答案 1 :(得分:1)
你有什么理由不能用纯粹的字母数字值吗?如果您有不透明的二进制数据,那么您可以使用hex或使用“web safe”base64。
你做错的可能性就越小,任何人都会把你的cookie 搞砸了,这是更好的IMO。