网站的Cookie管理除了限定Domain增强安全性之外,.net 2.0新增一个Cookie属性HttpOnly。很棒!
在做一个cookie功能时用到了Cookie的一个属性HttpOnly

Code
<!-- {cps..10}-->
HttpCookiea
=
new
HttpCookie(
"
TestName
"
,
"
TestValue
"
);
a.Domain
=
"
.test.com
"
;
a.HttpOnly
=
true
;
Response.Cookies.Add(a);

原以为这样后,客户端应该无法访问该Cookie了!
结果,如图
感觉比较诡异,于是再查MSDN
得知原来有两个cookie类。System.Web.HttpCookie 类 和 System.Net.Cookie 类
注意命名空间不同。
两个类的说明分别如下:
Cookie 类提供一组用于管理 Cookie 的属性和方法。无法继承此类。命名空间:
System.Net
HttpCookie 类
提供创建和操作各 HTTP Cookie 的类型安全方法。
命名空间:
System.Web
两个类都有HttpOnly属性,分别说明如下:
Cookie.HttpOnly 属性注意:此属性在 .NET Framework 2.0 版中是新增的。确定页脚本或其他活动内容是否可访问此 Cookie。
HttpCookie.HttpOnly 属性注意:此属性在 .NET Framework 2.0 版中是新增的。
获取或设置一个值,该值指定 Cookie 是否可通过客户端脚本访问。
问题来了,关键的理解点在于通过什么东东来访问。
不太理解微软机器翻译的“页脚本或其他活动内容
”究竟指什么玩意?
于是做测试,建立一个Web Application,
在TestCookie.aspx页面,的Page_Load事件中加入

Code
<!-- {cps..16}-->
//
Response.Cookies.Clear();
//
System.Web.HttpCookie;
HttpCookiea
=
new
HttpCookie(
"
TestName
"
,
"
TestValue
"
);
//
a.Domain=Request.ServerVariables["HTTP_HOST"];
a.HttpOnly
=
false
;
Response.Cookies.Add(a);

HttpCookieb
=
new
HttpCookie(
"
TestB
"
,
"
TestB
"
);
b.HttpOnly
=
true
;
//
b.Domain=Request.ServerVariables["HTTP_HOST"];
Response.Cookies.Add(b);
Response.Write(
"
System.Web.HttpCookie;------------<br/>
"
);
for
(
int
i
=
0
;i
<
Request.Cookies.Count;i
++
)

{
HttpCookiecook
=
Request.Cookies[i];

Response.Write(
"
<Br/>
"
);
Response.Write(
"
Cookie:
"
);
Response.Write(
string
.Format(
"
{0}={1}
"
,cook.Name,cook.Value)
+
"
<Br/>
"
);
//
Response.Write(string.Format("Domain:{0}",cook.Domain)+"<Br/>");
Response.Write(
string
.Format(
"
Path:{0}
"
,cook.Path)
+
"
<Br/>
"
);
Response.Write(
string
.Format(
"
Secure:{0}
"
,cook.Secure)
+
"
<Br/>
"
);
Response.Write(
string
.Format(
"
HttpOnly:{0}
"
,cook.HttpOnly)
+
"
<Br/>
"
);
}

//
//
System.Net.CookieContainerCookieContainerObject=newSystem.Net.CookieContainer();
System.Net.CookieCollectionCookieCollectionObject
=
new
System.Net.CookieCollection();
System.Net.Cookiea2
=
new
System.Net.Cookie(
"
TestName2
"
,
"
TestValue2
"
);
a2.HttpOnly
=
false
;
a2.Domain
=
Request.ServerVariables[
"
HTTP_HOST
"
];
//
CookieContainerObject.Add(a2);
CookieCollectionObject.Add(a2);

System.Net.Cookieb2
=
new
System.Net.Cookie(
"
TestB2
"
,
"
TestB2
"
);
b2.HttpOnly
=
true
;
b2.Domain
=
Request.ServerVariables[
"
HTTP_HOST
"
];
//
CookieContainerObject.Add(b2);
CookieCollectionObject.Add(b2);

Response.Write(
"
<Br/>
"
);
Response.Write(
"
System.Net.Cookie;*********************<br/>
"
);
foreach
(System.Net.Cookieck
in
CookieCollectionObject)

{

Response.Write(
"
<Br/>
"
);
Response.Write(
"
Cookie:
"
);
Response.Write(
string
.Format(
"
{0}={1}
"
,ck.Name,ck.Value)
+
"
<Br/>
"
);
//
Response.Write(string.Format("Domain:{0}",ck.Domain)+"<Br/>");
Response.Write(
string
.Format(
"
Path:{0}
"
,ck.Path)
+
"
<Br/>
"
);
Response.Write(
string
.Format(
"
Secure:{0}
"
,ck.Secure)
+
"
<Br/>
"
);
Response.Write(
string
.Format(
"
HttpOnly:{0}
"
,ck.HttpOnly)
+
"
<Br/>
"
);
}
该段代码的功能主要是测试能否正确读写Cookie
结果如下:

Code
<!-- {cps..12}-->
System.Web.HttpCookie;------------

Cookie:TestName=TestValue
Domain:10.103.33.102:2888
Path:/
Secure:False
HttpOnly:False

Cookie:TestB=TestB
Domain:10.103.33.102:2888
Path:/
Secure:False
HttpOnly:True

System.Net.Cookie;*********************

Cookie:TestName2=TestValue2
Domain:10.103.33.102:2888
Path:
Secure:False
HttpOnly:False

Cookie:TestB2=TestB2
Domain:10.103.33.102:2888
Path:
Secure:False
HttpOnly:True
再建一ConSole Application,
看看能否获取并修改该页面的Cookie
代码如下:

Code
<!-- {cps..13}-->
string
surl
=
"
http://10.103.33.102:2888/TestCookie.aspx
"
;
HttpWebRequestWebRequestObject
=
(HttpWebRequest)WebRequest.Create(surl);
WebRequestObject.CookieContainer
=
new
CookieContainer();
HttpWebResponseWebResponseObject
=
(HttpWebResponse)WebRequestObject.GetResponse();

System.Net.CookieCollectionCookieCollectionObject
=
new
System.Net.CookieCollection();
//
Printthepropertiesofeachcookie.
foreach
(Cookiecook
in
WebResponseObject.Cookies)

{
Console.WriteLine(
"
-----------------------System.Web.HttpCookie--------------------------
"
);
Console.WriteLine(
"
Cookie:
"
);
Console.WriteLine(
"
{0}={1}
"
,cook.Name,cook.Value);
Console.WriteLine(
"
Domain:{0}
"
,cook.Domain);
Console.WriteLine(
"
Path:{0}
"
,cook.Path);
Console.WriteLine(
"
Port:{0}
"
,cook.Port);
Console.WriteLine(
"
Secure:{0}
"
,cook.Secure);
Console.WriteLine(
"
HttpOnly:{0}
"
,cook.HttpOnly);

/**/
//////
Showthestringrepresentationofthecookie.
///
/Console.WriteLine("String:{0}",cook.ToString());
System.Net.Cookiec
=
new
System.Net.Cookie();
c.Name
=
cook.Name;
c.Path
=
cook.Path;
c.HttpOnly
=
cook.HttpOnly;
c.Domain
=
cook.Domain;
c.Expires
=
cook.Expires;
c.Value
=
cook.Value;
CookieCollectionObject.Add(cook);
}

foreach
(System.Net.Cookieck
in
CookieCollectionObject)

{

Console.WriteLine(
"
----------------------System.Net.Cookie-------------------------------------
"
);
Console.WriteLine(
"
Cookie:
"
);
Console.WriteLine(
"
{0}={1}
"
,ck.Name,ck.Value);
Console.WriteLine(
"
Domain:{0}
"
,ck.Domain);
Console.WriteLine(
"
Path:{0}
"
,ck.Path);
Console.WriteLine(
"
Port:{0}
"
,ck.Port);
Console.WriteLine(
"
Secure:{0}
"
,ck.Secure);
Console.WriteLine(
"
HttpOnly:{0}
"
,ck.HttpOnly);

System.Web.HttpCookiec
=
new
System.Web.HttpCookie(ck.Name);
c.Name
=
ck.Name;
c.Path
=
ck.Path;
c.HttpOnly
=
ck.HttpOnly;
c.Domain
=
ck.Domain;
c.Expires
=
DateTime.Now.AddDays(
1
);
c.Value
=
ck.Value
+
"
--Update
"
;
WebResponseObject.Cookies.Add(ck);
}

foreach
(Cookiecook
in
WebResponseObject.Cookies)

{
Console.WriteLine(
"
-----------------UpdateedSystem.Web.HttpCookie--------------------------
"
);
Console.WriteLine(
"
Cookie:
"
);
Console.WriteLine(
"
{0}={1}
"
,cook.Name,cook.Value);
Console.WriteLine(
"
Domain:{0}
"
,cook.Domain);
Console.WriteLine(
"
Path:{0}
"
,cook.Path);
Console.WriteLine(
"
Port:{0}
"
,cook.Port);
Console.WriteLine(
"
Secure:{0}
"
,cook.Secure);
Console.WriteLine(
"
HttpOnly:{0}
"
,cook.HttpOnly);

}
运行结果

Code
<!-- {cps..14}-->
-----------------------System.Web.HttpCookie--------------------------
Cookie:
TestName=TestValue
Domain:10.103.33.102
Path:/
Port:
Secure:False
HttpOnly:False
-----------------------System.Web.HttpCookie--------------------------
Cookie:
TestB=TestB
Domain:10.103.33.102
Path:/
Port:
Secure:False
HttpOnly:True
----------------------System.Net.Cookie-------------------------------------
Cookie:
TestName=TestValue
Domain:10.103.33.102
Path:/
Port:
Secure:False
HttpOnly:False
----------------------System.Net.Cookie-------------------------------------
Cookie:
TestB=TestB
Domain:10.103.33.102
Path:/
Port:
Secure:False
HttpOnly:True
-----------------UpdateedSystem.Web.HttpCookie--------------------------
Cookie:
TestName=TestValue
Domain:10.103.33.102
Path:/
Port:
Secure:False
HttpOnly:False
-----------------UpdateedSystem.Web.HttpCookie--------------------------
Cookie:
TestB=TestB
Domain:10.103.33.102
Path:/
Port:
Secure:False
HttpOnly:True
请注意, c.Value = ck.Value+"--Update";这句在修改Cookie.value后并没有成功写入该页面的Cookie集合中,换言之,一个未知的客户端应用程序并没有通过读取一个页面的Cookie并修改再写入该页面的Cookie集合。
我的理解是:
1、System.Web.httpCookie主要是服务器端应用。
System.Net.Cookie主要是客户端程序应用,后者可以读取前者的Cookie属性和值,而不能修改服务器定义的Cookie。
2、System.Web.httpCookie.HttpOnly=true后,客户端脚本无法访问该Cookie,但其他程序仍然可以访问。
System.Net.Cookie.HttpOnly=true后,困其是客户端程序,故有更多的限制,不允许”页面脚本及其他程序“访问
该Cookie, 只有创建它的应用程序可以访问。并且在特定的Domain下。
值得注意的是:HttpOnly属性仅对IE 6 SP1以上的版本才有效,在FireFox3.01下也可以!但对于IE5.x的机器,可能就****
欢迎大伙指正。