使用 .net 的 (C#) System.Net.Cookie 处理 cookie 值中的逗号

Posted

技术标签:

【中文标题】使用 .net 的 (C#) System.Net.Cookie 处理 cookie 值中的逗号【英文标题】:handling a comma inside a cookie value using .net's (C#) System.Net.Cookie 【发布时间】:2009-07-16 09:23:15 【问题描述】:

我正在创建一个客户端来访问一个网站并自动登录 + 执行一些任务,但是他们最近更新了他们的 cookie(无论出于何种原因......)在他们的标识 cookie 中包含一个逗号。

因此,例如,Cookie 将具有类似于以下的值:

a,bcdefghijklmnop

问题是,根据msdn,您不能在 cookie 的值中使用逗号或句点。我正在寻找一种解决此限制的方法,一种使 .net 的 Cookie 与逗号配合得很好的方法。我发现服务器确实向客户端发送了一个“SET-COOKIE”标头,我猜这就是正在解析的内容,但这似乎也显然给命令和分号赋予了特殊含义(因此限制.NET 本身内部的类)。

但是,IE、Firefox 等浏览器是如何正确处理 cookie 的(正如他们显然所做的那样,因为该网站在我测试过的任何浏览器中都可以正常工作。)有没有办法在 .NET 中强制执行此行为?

任何帮助将不胜感激,谢谢。

--- 编辑 ---

一些附加信息:

我的代码如下所示:

request = (HttpWebRequest)WebRequest.Create(URI); 
request.CookieContainer = Program.client.cookieJar;

其中 cookieJar 在 Program.client 中定义为:

CookieContainer cookieJar = new CookieContainer();

当我遍历并打印出 CookieContainer 中的所有 cookie 时,我得到如下信息:(cookies,格式为:“name”->“value”)

"normal_cookie" -> "i am the value" 
"messedup_cookie" -> "a" 
"bcdefghijklmnop" -> "" 

// What I should get is this: 
"normal_cookie" -> "i am the value" 
"messedup_cookie" -> "a,bcdefghijklmnop" 

问题的核心似乎是逗号和分号是 SET-COOKIE 标头字符串中的保留字符...但是浏览器如何处理呢?我可能可以自己解析字符串,但我不知道如何解决这种情况:(HTTP 标头,格式为:“name”->“value”)

"Set-Cookie" -> "messedup_cookie=a,bcdefghijklmnop; path=/; domain=.domain.com; expires=Sat, 15-Aug-2009 09:14:24 GMT,anothervariable=i am the value;"

如您所见,expires 部分查找逗号而不是分号以将其与下一个变量区分开来。据我所知,格式如下:

cookie1_var1=value; cookie1_var2=value,cookie2_var1=value; cookir2_var2=value

但如果这是真的,是否有一种优雅的方式来处理可能出现在其中一个值中的逗号?

【问题讨论】:

【参考方案1】:

根据the following article,您应该考虑使用 UrlEncode 和 UrlDecode 将值存储在 cookie 中。

private void SetCookie()

    HttpCookie cookie = new HttpCookie("cookiename");
    cookie.Expires = DateTime.Now.AddMonths(24);
    cookie.Values.Add("name", Server.UrlEncode(txtName.Text));
    Response.Cookies.Add(cookie);


private void GetCookie()

    HttpCookie cookie = Request.Cookies["cookiename"];
    if (cookie != null)
    
        txtName.Text = Server.UrlDecode(cookie.Values["name"]);
    

永远不要在 ASP.NET 中对 cookie 进行 HTML 编码!它会导致黄色 死亡屏幕和异常 说明 cookie 包含 危险人物。

MSDN also has an article 关于这个主题。

ASP.NET 不编码或取消编码 UrlEncode 格式的cookies 默认。因此,您可能 遇到意外的行为 ASP.NET 应用程序。

【讨论】:

感谢您的回答,但我有同样的问题,因为我问过上一张海报 - 我如何使用 CookieContainer 做到这一点?另外,如果这有什么不同的话,我使用的是 C# 而不是 ASP.net。【参考方案2】:

要处理 cookie,由于 cookie 本质上是一个字符串,您可能想尝试在设置 cookie 值之前对其进行 URL 编码,然后在提取值时对其进行解码。

即:

Response.Cookies["Value1"] = Server.UrlEncode(sCookieValue);

同样:

string sCookieValue = Server.UrlDecode(Request.Cookies["Value1"]);

【讨论】:

嗯,但是我将如何使用 CookieContainer 来做到这一点?我想我应该更清楚地开始......我的代码是这样的:request = (HttpWebRequest)WebRequest.Create(URI); request.CookieContainer = Program.client.cookieJar;这样 CookieContainer 会为我处理所有的 cookie 内容,我只是在 http 请求之间传递它 什么是创建 Program.client.cookieJar?您可以创建一个包装类,它可能会使用 UrlEncode 自动转置所有通过容器的 cookie,然后使用修改后的 cookieJar 设置请求上的基本 CookieContainer 属性 CookieContainer cookieJar = new CookieContainer();我不知道如何为它设置一个包装器,因为我不知道在什么时候实际解析了标头。当我遍历 CookieContainer 中的所有 cookie 时,我得到如下信息:csharp.pastebin.com/f1bb0dffa 问题的核心似乎是逗号和分号是 SET-COOKIE 标头字符串中的保留字符......但是浏览器如何处理这个(事情?我可能可以自己解析字符串,但我不知道如何解决这样的情况:csharp.pastebin.com/f5dcaf847

以上是关于使用 .net 的 (C#) System.Net.Cookie 处理 cookie 值中的逗号的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 System.Net 类的情况下在 C# 中发送 HTTP 请求? [复制]

在 C# 中调用 Gmail 服务 API 时出现 System.Net.Http.HttpRequestException

C# System.Net.WebException 检索自定义 404 消息

可以在 C# 中的委托上传递 System.Net.Mail.MailMessage 对象吗?

c# 视频下载

Httpclient在.net core3.1上成功运行,但更新到.net 5中连接超时(System.Net.Sockets.SocketException (10060)) C#