45

HTTP Cookie 由一个名称-值对组成,并且可以由服务器使用以下响应设置:

HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: name=value
Set-Cookie: name2=value2; Expires=Wed, 09 Jun 2021 10:18:14 GMT

来自客户端的未来请求将如下所示:

GET /spec.html HTTP/1.1
Host: www.example.org
Cookie: name=value; name2=value2

cookie 的名称是否区分大小写?

例如,如果我的服务器这样发送响应:

HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: Aaaa=Bbbb
Set-Cookie: aAaa=bBbb
Set-Cookie: aaAa=bbBb
Set-Cookie: aaaA=bbbB

期望客户端(Chrome、FireFox、Safari、IExplorer、Opera 等)发送带有标头的未来请求是否合理Cookie: Aaaa=Bbbb; aAaa=bBbb; aaAa=bbBb; aaaA=bbbB;

注意:问题既不是 JSP 特定的、PHP 特定的,也不是 ASP 特定的。

4

5 回答 5

44

Cookie 名称区分大小写。RFC 没有明确说明,但是每个不区分大小写的比较都明确说明,并且没有关于 cookie 名称的明确说明。Chrome 和 Firefox 都将 cookie 视为区分大小写,并将所有大小写变体保留为不同的 cookie。

测试用例(PHP):

print_r($_COOKIE);

setcookie('foo', '123');
setcookie('Foo', '456');

加载脚本两次,在第二次运行时观察$_COOKIE转储。

于 2012-07-03T13:42:49.930 回答
5

底部是一个在浏览器和 .Net 框架上演示 Cookie 区分大小写的脚本。每次运行时,都会插入一个名为 xxxxxxxxxx 的 cookie,大小写随机。按 F5 刷新几次以插入一些 cookie。

我已经在 Chrome 和 Firefox 上对其进行了测试,并且都表现出类似的行为,如下所示:

Request.Cookies["xxxxxxxxxx"].Name returns: xxxxXxXXXX
All XXXXXXXXXX Cookies:

    xxxxXxXXXX
    xXxxXxXXXx
    XxxxxXxXXx
    XXXxXxXXxX

表明:

  • Cookie 在 Chrome 和 Firefox 上区分大小写
  • .Net Framework 可以处理区分大小写的 cookie(这就是它可以遍历所有这些 cookie 的原因)
  • Request.Cookies["xxxxxxxxxx"] 不区分大小写(这就是为什么它返回第一个不区分大小写匹配名称的 cookie)

正如其他答案中提到的,新的 RFC 表明 cookie 区分大小写,Chrome 和 Firefox 似乎都以这种方式处理它。.Net Framework 可以处理区分大小写的 cookie,但它确实希望不区分大小写地处理 cookie,并且它的许多函数确实以这种方式处理 cookie(Cookies[]、Cookies.Set() 等)。这种不一致会导致许多难以跟踪的错误。

测试Cookie.aspx:

<%@ Page language="c#" AutoEventWireup="false" validateRequest=false %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title id="title">Test Cookie Sensitivity</title>
</head>
<body>
<p>Request.Cookies["xxxxxxxxxx"].Name returns:
<%
    HttpCookie cookie2 = Request.Cookies["xxxxxxxxxx"];
    if (cookie2 == null) Response.Write("No cookie found");
    else Response.Write(cookie2.Name);
%>
</p>
<h3>All XXXXXXXXXX Cookies:</h3>
<ul>
<%
    foreach (string key in Request.Cookies.Keys)
        if (key.ToLower() == "xxxxxxxxxx") Response.Write("<li>" + key + "</li>");
    Random rand = new Random();
    StringBuilder name = new StringBuilder();
    for (int i = 0; i < 10; i++) {
        if (rand.Next(2) == 0) name.Append('x');
        else name.Append('X');
    }
    HttpCookie cookie = new HttpCookie(name.ToString());
    cookie.HttpOnly = true;
    cookie.Expires = DateTime.Now.AddMonths(1);
    Response.Cookies.Add(cookie);
%>
</ul>
</body>
</html>
于 2014-06-25T14:16:49.750 回答
3

似乎 cookie 实际上是区分大小写的。对此有些困惑。有趣的是,MSDN 另有说明:

Cookie 名称不区分大小写

来源: http: //msdn.microsoft.com/en-us/library/ms970178.aspx文章底部©2002说它可能已经过时了。

此外,asp.net 论坛中也有人问过这个问题:http ://forums.asp.net/t/1170326.aspx?Are+cookie+names +case+sensitive+ 似乎答案是区分大小写的.

这是怎么回事?MSDN 说不,其他技术说是。可以肯定的是,我使用 ASP Classic 对此进行了测试。

代码

hashUCASE = Request.Cookies("data")("Hash")
hashLCASE = Request.Cookies("data")("hash")

Response.Write "<p> hashUCASE = " & hashUCASE
Response.Write "<br> hashLCASE = " & hashLCASE


cookieNameUCASE = Request.Cookies("Data")
cookieNameLCASE = Request.Cookies("data")

Response.Write "<p> cookieNameUCASE = " & cookieNameUCASE
Response.Write "<br> cookieNameLCASE = " & cookieNameLCASE

Response.End

结果

hashUCASE: EE3305C0DAADAAAA221BD5ACF6996AAA
hashLCASE: EE3305C0DAADAAAA221BD5ACF6996AAA

cookieNameUCASE: name=1&Hash=EE3305C0DAADAAAA221BD5ACF6996AAA
cookieNameLCASE: name=1&Hash=EE3305C0DAADAAAA221BD5ACF6996AAA

正如您在结果中看到的那样,值“Hash”是用大写字母创建的,即使您使用小写字母发出请求,它也会返回相同的值,这使得它不区分大小写。在这种 MS 技术下,它不是。

结论

因此,在 ASP 经典中使用 Request.Cookies(),它区分大小写,就像微软所说的那样。但是等等,它不是又区分大小写了吗?这可能意味着是否敏感取决于向浏览器发出请求的服务器端技术,这可能会规范化 cookie 名称以发出请求,从而使其不区分大小写。但这是我们必须测试以验证的其他内容。

我的建议是使用您使用的任何技术进行测试,并在您的代码库中建立标准,与您的团队达成协议。即,如果您要使用 cookie,请决定在您要在代码中使用它的任何时候,它是否总是以小写或大写形式编写。这样就不会有任何区分大小写的问题,因为在您的代码中,它将始终以相同的大小写声明。

tl;博士

只要您保持 cookie 名称的约定,您就不会有区分大小写的问题。

于 2014-04-11T20:37:27.260 回答
2

根据RFC 2109 - HTTP State Management Mechanism cookie 名称又名属性名称不区分大小写

4.1 语法:通用

两个状态管理标头 Set-Cookie 和 Cookie 具有涉及属性值对的共同句法属性。以下语法使用 HTTP/1.1 规范 [RFC 2068] 中的符号、标记 DIGIT(十进制数字)和标记(非正式地,非特殊、非空白字符的序列)来描述它们的语法。

av-pairs        =       av-pair *(";" av-pair)
av-pair         =       attr ["=" value]        ; optional value
attr            =       token
value           =       word
word            =       token | quoted-string

属性(名称)(attr)不区分大小写。 令牌之间允许有空格。请注意,虽然上面的语法描述显示 value 是可选的,但大多数 attrs 都需要它们。

于 2013-03-04T19:42:49.843 回答
1

根据MSDN,cookie 名称不区分大小写。但是,我不确定这是否只是 ASPX/IIS 特定的实现。我相信这也取决于网络服务器和语言。

如果您发送一个名为“UserID”的 cookie,浏览器将确保将其作为“UserID”发送回,而不是“userid”。

于 2012-07-03T13:26:53.820 回答