我在使用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的cookies。 Foonot还可以看到Foo的饼干。 Foonot和Foobar没有看到对方的饼干。
以下是来自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吗?
答案 0 :(得分:0)
我不确定Foo,Foobar和Foonot的实际网址是什么。
但是,cookie可以在多个子域之间共享。
例如,IE10在以下网站中共享cookie -
mysite.com
Foo.mysite.com
Foobar.mysite.com
Foono.mysite.com
如果您希望cookie仅在特定域中可用,则可以设置cookie的域属性。
myCookie.Domain = "Foo.mysite.com";
答案 1 :(得分:0)
在确定请求中是否包含cookie时,cookie路径不会被检查为“路径”,而只是作为字符串值。
如果它作为路径处理,那么一个站点恰好以与另一个站点相同的文本开头的事实不会导致匹配。 MyDomain.com/Foo 是与 MyDomain.com/Foobar 不同的网站。我将其视为一个不同的站点,IIS将其作为一个不同的网站提供服务,但浏览器将它们视为与cookie相关的路径。浏览器只是在路径值上进行字符串比较,“/ Foo”是“/ Foobar”的开头,因此浏览器包含这些cookie。
通常使用此方法,以便父网站的cookie可供我们网站的儿童使用。如果有一个名为“Parent”的站点和一个名为“Child”的嵌套站点,那么父站点的路径为“/ Parent”的cookie将可供子站点使用。父母无法使用路径为“/ Parent / Child”的孩子的cookie。我遇到的情况是,当兄弟姐妹的路径是该网站路径的起点时,网站可以为其中一个人提取cookie。
我怀疑这个字符串比较会导致cookie路径区分大小写。
所以我的问题的答案是:
这是一个众所周知的事情吗?
是。浏览器在cookie的路径上进行简单的字符串比较,以确定它是否应该在请求中包含cookie。
有没有办法阻止这种情况?
是。在路径末尾附加斜杠。 “/ Foo /”不再是“/ Foobar /”
的子集myCookie.Path = Me.Request.ApplicationPath + "/"
这不是一个很大的安全问题吗?在共享托管环境中,我无法创建比现有域名更长的域名并提取其Cookie?
没有。正如@the_lotus指出的那样,域名会有所不同。路径仅在域中具有效果。我只考虑路径而没有考虑域名。