14

我正在创建一个客户端来访问一个网站并自动登录 + 执行一些任务,但是他们最近将他们的 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 时,我得到如下信息:(cookie,格式为:“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

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

4

2 回答 2

8

根据以下文章,您应该考虑使用 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 也有一篇关于这个主题的文章。

默认情况下,ASP.NET 不对 UrlEncode 格式的 cookie 进行编码或取消编码。因此,您可能会在 ASP.NET 应用程序中遇到意外行为。

于 2009-07-16T09:33:21.067 回答
4

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

IE:

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

同样:

string sCookieValue = Server.UrlDecode(Request.Cookies["Value1"]);
于 2009-07-16T09:31:27.000 回答