甲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-具体。
Cookie的名称区分大小写 。 该RFC并没有说明明确,但各不区分大小写的比较说得这么明确,并有关于cookie的名字没有这样明确的说法。 Chrome和Firefox这两种治疗饼干作为区分大小写 ,并保留所有变体情况下为不同的饼干。
测试用例(PHP):
print_r($_COOKIE);
setcookie('foo', '123');
setcookie('Foo', '456');
加载脚本两次,观察$_COOKIE
在第二次运行转储。
在底部是一个说明在浏览器和.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>
这似乎饼干实际上是区分大小写。 那里有一些混乱与此有关。 有趣的是,在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名称的公约,你不会有区分大小写的问题。
根据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需要他们。
根据MSDN ,饼干名称是不区分大小写。 但是,我不知道,如果这只是ASPX / IIS具体实施。 我认为这取决于Web服务器和语言上也是如此。
如果你发送一个名为“用户名” cookie时,浏览器会确保他们发回的“用户名”,而不是“用户id”。