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

Pac*_*ier 37 cookies standards http cross-browser

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
Run Code Online (Sandbox Code Playgroud)

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

GET /spec.html HTTP/1.1
Host: www.example.org
Cookie: name=value; name2=value2
Run Code Online (Sandbox Code Playgroud)

区分大小写的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
Run Code Online (Sandbox Code Playgroud)

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

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

lan*_*nzz 36

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

测试用例(PHP):

print_r($_COOKIE);

setcookie('foo', '123');
setcookie('Foo', '456');
Run Code Online (Sandbox Code Playgroud)

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

  • @Pacerier Peer引用了一个过时的RFC.[RFC 2109](http://www.ietf.org/rfc/rfc2109.txt)已被[RFC 2965](http://tools.ietf.org/html/rfc2965)废弃,而后者又被废弃了[RFC 6265](http://tools.ietf.org/html/rfc6265)废弃. (6认同)
  • 你有没有读过我的答案?__All__主要浏览器以___区分大小写___的方式处理cookie名称,因为_这就是RFC_中规定的内容.你是否告诉我RFC是无关紧要的,因为你发现_至少Internet Explorer实际上跟着它?更不用说如果_your code_以区分大小写的方式处理cookie,那么如果浏览器也这样做,那就不重要了.如果您将它们视为不区分大小写,但浏览器区分大小写则不是这样. (6认同)
  • 它完全不相关RFC所说的内容!我们编写的代码可以在当今使用的浏览器上运行:IE,Firefox,Chrome.由于我们的代码必须工作,我们必须只关心浏览器的实现方式.我可以说至少Internet Explorer是区分大小写的,所以我们应该将cookie视为区分大小写以避免出现问题! (2认同)

小智 5

底部的脚本演示了浏览器和.Net框架对Cookie大小写的敏感性。每次运行时,它将插入一个名为xxxxxxxxxx的cookie,且大小写随机。按F5刷新几次以插入一些cookie。

我已经在Chrome和Firefox上进行过测试,并且都展示了类似的行为,如下所示:

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

    xxxxXxXXXX
    xXxxXxXXXx
    XxxxxXxXXx
    XXXxXxXXxX
Run Code Online (Sandbox Code Playgroud)

表明:

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

如其他答案中所述,新的RFC表示cookie区分大小写,Chrome和Firefox似乎都采用这种方式。.Net Framework可以处理区分大小写的cookie,但是它确实希望不区分大小写地对待cookie,并且它的许多功能确实以这种方式对待cookie(Cookies [],Cookies.Set()等)。这种不一致会导致许多难以跟踪的错误。

TestCookie.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>
Run Code Online (Sandbox Code Playgroud)

  • 这可能只是 .NET api 的问题,与 HTTP 标准无关...... (2认同)