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在第二次运行时观察转储.
小智 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)
表明:
如其他答案中所述,新的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)