【问题标题】:How come one web site can pickup cookies from another web site为什么一个网站可以从另一个网站获取 cookie
【发布时间】: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。想想你的问题,给我一个答案。

标签: asp.net vb.net cookies


【解决方案1】:

我不确定 Foo、Foobar 和 Foonot 的实际 URL 是什么。

但是,一个 cookie 可以在多个子域之间共享。

例如,IE10 在以下站点之间共享 cookie -

mysite.com 
Foo.mysite.com 
Foobar.mysite.com 
Foono.mysite.com

如果您希望 cookie 仅在特定域中可用,您可以设置 cookie 的 Domain 属性。

myCookie.Domain = "Foo.mysite.com";

【讨论】:

  • 这些都在同一个域上。 URL 是 webdev/Foo、webdev/Foobar 和 webdev/Foonot。 (webdev 是一个内部服务器)。我不是想分享 cookie,我想了解 /Foobar 为何能看到 /Foo 的 cookie。
【解决方案2】:

在确定请求中是否包含 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 指出的那样,域会有所不同。路径仅在域内有效。我只考虑路径,没有考虑域。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 2015-08-27
    • 2015-01-07
    • 1970-01-01
    相关资源
    最近更新 更多