是一个cookie例的名字敏感?(Is the name of a cookie case sens

2019-06-26 00:22发布

甲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

是饼干例的名字敏感?

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

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

它是合理的预期客户端(浏览器,火狐,Safari,IEXPLORER,歌剧等)发送与头部将来的请求Cookie: Aaaa=Bbbb; aAaa=bBbb; aaAa=bbBb; aaaA=bbbB; Cookie: Aaaa=Bbbb; aAaa=bBbb; aaAa=bbBb; aaaA=bbbB;

注:问题既不是JSP特定的,PHP特有的,也不是ASP-具体。

Answer 1:

Cookie的名称区分大小写 。 该RFC并没有说明明确,但各区分大小写的比较说得这么明确,并有关于cookie的名字没有这样明确的说法。 Chrome和Firefox这两种治疗饼干作为区分大小写 ,并保留所有变体情况下为不同的饼干。

测试用例(PHP):

print_r($_COOKIE);

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

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



Answer 2:

在底部是一个说明在浏览器和.NET Framework的Cookie区分大小写的脚本。 每次运行时,它会插入一个cookie命名为XXXXXXXXXX,随机上/下案件。 按F5刷新几次插入几块饼干。

我有TESTE它放在Chrome和Firefox,并且都表现出类似的行为,类似下面:

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

    xxxxXxXXXX
    xXxxXxXXXx
    XxxxxXxXXx
    XXXxXxXXxX

表明:

  • Cookies是对的情况下Chrome和Firefox敏感
  • .NET框架可以处理区分大小写的Cookie(这就是为什么它可以通过所有这些Cookie环)
  • Request.Cookies时[“XXXXXXXXXX”]不区分大小写(这就是为什么它返回一个大小写不敏感的名称相匹配的第一个Cookie)

正如在其他的答案中提到,新的RFC表明,饼干是大小写敏感的,并且两个Chrome和Firefox似乎来处理它的方式。 .NET框架可以处理区分大小写的饼干,但它确实希望把饼干不区分大小写,它的许多功能根本治疗饼干这样(饼干[],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>


Answer 3:

这似乎饼干实际上是区分大小写。 那里有一些混乱与此有关。 有趣的是,在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经典。

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

正如你可以在结果中看到,值“哈希”用大写字母创建,甚至当你与小写的请求时,它返回相同的值,这使得它不区分大小写。 在此MS技术,事实并非如此。

结论

因此,使用Request.Cookies时()在ASP经典,这是区分大小写,像微软说。 别急,是不是区分大小写一遍吗? 这可能意味着是否敏感或不依赖于服务器端的技术,使请求的浏览器,它可以被标准化cookie的名称作出的要求,从而使得它不区分大小写。 但是,这是其他的东西我们必须要通过测试来验证。

我的建议是让与任何技术使用的是测试,并在你的代码库建立一个标准,让您的团队的协议。 也就是说,如果你要使用Cookie,决定是否将永远写在大写或小写任何时候你要在你的代码中使用它。 这样,不会有任何区分大小写的问题,因为在你的代码将总是以相同的情况下宣布。

TL;博士

只要你保持与cookie名称的公约,你不会有区分大小写的问题。



Answer 4:

根据RFC 2109 - HTTP状态管理机制 cookie名称又名属性名称不区分大小写

4.1语法:一般

这两种状态管理头,设置Cookie和饼干,有涉及到属性值对常见的语法属性。 以下语法使用的符号,和令牌DIGIT(十进制数字)和令牌(非正式的非特殊的,非空白字符的序列)从HTTP / 1.1规范[RFC 2068]来描述他们的语法。

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

属性(名称)(attr)使用不区分大小写。 白色空间标记之间允许的。 注意,虽然上面的语法描述显示值作为可选,大多数ATTRS需要他们。



Answer 5:

根据MSDN ,饼干名称是不区分大小写。 但是,我不知道,如果这只是ASPX / IIS具体实施。 我认为这取决于Web服务器和语言上也是如此。

如果你发送一个名为“用户名” cookie时,浏览器会确保他们发回的“用户名”,而不是“用户id”。



文章来源: Is the name of a cookie case sensitive?