2009-08-21 67 views
3

根据RFC 2109,Cookie的值对用户代理不透明,可能是源服务器选择发送的任何内容,可能是服务器选择的可打印ASCII编码。在C#中处理编码的cookie值

因此,即使原始值相同,不同的语言/平台/服务器也会发送不同的cookie值。

例如,C#/ ASP.NET按原样发送文本;经典的ASP urlencodes和urldecodes文本; Perl/Apache urlencodes /解码文本(但与ASP不同!)。 Php给你的选择。

我在写一个单一登录系统,需要与非常不同的应用程序共享一个cookie。特别是我有需要立即支持的.NET,Java,Perl,ColdFusion。

我在cookie中存储的文本始终是有效的ASCII-7字符串。不过,例如,Perl喜欢编码一些7位ASCII字符。

我看到两个主要备选方案,以使这项工作:

  1. 只接受非编码的值。毕竟没有必要对它们进行编码。这是目前的情况。显然,所有集成系统必须能够支持非编码值。

  2. 接受编码值和非编码值。这将允许出现最大的兼容性,但我需要确定一个特定的值是否被编码(这听起来是不可能的:字符“%20”字符串或空格是“%20”?)

您会建议哪种解决方案?为什么?如果它是#2,你会如何检测UrlEncoded文本?


一个cookie的例子(我已经添加了换行符,使其适合)

A5A2794D694241AD92F9B22F288EFAA1|8428DCCC|20090821142732|20090821142832| 
10.100.107.40|955098D50AB4982D4E247EFA53F4E23B32A05ED0131E096709BE1D8CCC 
8A3CA18252D376473C244FD71C462AB42CF54C 

回答

1

任何原因你不能纯粹的字母数字值?如果你有不透明的二进制数据你试图坚持,那么你可以使用十六进制或使用“网页安全”base64。

你做这件事的可能性就越小,任何人都会用你的cookie 来处理所有的,更好的IMO。

+0

我已经在使用HEX。唯一的非字母数字是用于分隔字段的管道字符 - 这就是perl编码的内容。另一方面,任何字符都可以编码为我在其他平台下知道的所有字符。你永远不知道:) – Sklivvz 2009-08-21 14:25:52

+1

我想如果你坚持字母数字,它会没事的。只需使用X作为分隔符而不是|。 – 2009-08-21 14:27:42

3

是的,这不是一个简单的问题。从根本上说,我更倾向于解决方案2,因为这是最具互操作性的。然而,正如您所说,检测哪些Cookie是URL编码的,而哪些不是不重要的问题非常重要。

我想到的一件事是,您可以使用一些特殊字符来填充Cookie值的开始,这样您就可以检测Cookie是否被编码。当然,这可能不包括所有的客户端,但例如,如果您的正常Cookie值的格式为CookieValue1234那么您可以将其更改为head :CookieValue1234并检查其中是否会返回URL编码或不是(即回到“%20”或“”)。

+0

绝对是最安全的解决方案,如果您想测试多种编码,则可以放置多个测试字符。 – 2009-08-21 14:34:46