【发布时间】:2014-07-04 04:10:26
【问题描述】:
我在使用 Fiddler 调试我们遇到的 cookie 问题时发现了一些有趣的事情。如果 cookie 路径值只是另一个站点路径值的开头,那么第二个站点会看到第一个站点的 cookie。
这比描述更容易展示。
我使用以下 ASPX 代码创建了一个简单的网站
<div>
Cookie Value <asp:Label ID="lblTest" runat="server"></asp:Label><br />
See Foo <asp:Label ID="lblSeeFoo" runat="server"></asp:Label><br />
See Foobar <asp:Label ID="lblSeeFoobar" runat="server"></asp:Label><br />
See Foonot <asp:Label ID="lblSeeFoonot" runat="server"></asp:Label>
</div>
在后面的代码中,我使用基于 ApplicationPath 的路径创建了一个 cookie。创建的 cookie 名称包含 ApplicationPath 名称,以便在 Fiddler 中轻松查看。此代码还会查找来自三个特定网站的 cookie。
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim CookieName As String = "Test " + Me.Request.ApplicationPath.Replace("/"c, "")
Dim myCookie As HttpCookie = Me.Request.Cookies(CookieName)
If (myCookie Is Nothing) Then
myCookie = New HttpCookie(CookieName)
myCookie.Path = Me.Request.ApplicationPath
myCookie.Expires = DateTime.Now.AddDays(1)
myCookie.Value = DateTime.Now.ToString()
Response.Cookies.Add(myCookie)
End If
Me.lblTest.Text = myCookie.Value
Dim TestCookie As HttpCookie
TestCookie = Me.Request.Cookies("Test Foobar")
Me.lblSeeFoobar.Text = CStr(TestCookie IsNot Nothing)
TestCookie = Me.Request.Cookies("Test Foonot")
Me.lblSeeFoonot.Text = CStr(TestCookie IsNot Nothing)
TestCookie = Me.Request.Cookies("Test Foo")
Me.lblSeeFoo.Text = CStr(TestCookie IsNot Nothing)
End Sub
此应用程序随后会发布到三个名为 Foo、Foobar 和 Foonot 的网站。
查看每个站点表明 Foobar 和 Foonot 可以看到 Foo 的 cookie。
这是 Foobar 的结果
Cookie Value 7/3/2014 10:40:01 AM
See Foo True
See Foobar True
See Foonot False
Foobar 可以读取 Foo 的 cookie。 Foonot 还可以看到 Foo 的 cookie。 Foonot 和 Foobar 看不到彼此的 cookie。
这是来自 Fiddler 的原始标头信息:
GET /Foobar/ HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: en-US
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3)
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Host: webdev
Cookie: Test Foobar=7/3/2014 10:40:01 AM; Test Foo=7/3/2014 10:39:43 AM
我尝试搜索有关此问题的信息,但找不到任何信息。
这是众所周知的事情吗?
有没有办法防止这种情况发生?
这不是一个大的安全问题吗?在共享托管环境中,我不能创建一个比现有域名更长的域名并获取他们的 cookie 吗?
【问题讨论】:
-
使用 cookie 的路径参数。
-
你的意思是cookie路径吗?我使用 ApplicationPath myCookie.Path = Me.Request.ApplicationPath 设置它。这就是问题的根源。站点可以选择具有不同路径的 cookie。
-
不同网站是什么意思?如果您正在谈论不同的路径但仍在使用 localhost ,那么是的,这是可能的。如果它们是不同的域,那就不同了。
-
@the_lotus。域是一样的。我所说的不同网站是指 domain.com/Foo、domain.com/Foobar 和 domain.com/Foonot。想想你的问题,给我一个答案。