6

设置:

我正在开发一个Formsauthentication使用 cookie 存储登录票的网站。该站点还有一个HTTPHandler管理存储在数据库中的图像。处理程序将图像缓存为公开并在 20 分钟后过期。我们注意到,由于图像与页面具有相同的生命周期,因此图像还包含Formsauthenticationcookie。配置为 IIS 6,Win2k 服务器,未启用 Content Expiration。

问题:

我们正在经历的是人 A 登录并点击了几页。然后人 B 会点击未登录的默认页面并获取人 A 的 cookie,并且能够看到人 A 的所有数据。我们曾经通过在 IIS 中打开内容过期来重现该问题,但并没有一致地重现,因此我们不确定内容过期是否有助于我们重现它。我们假设由于图像被缓存为公共图像,并且它们还包含带有 的 cookie FormsAuthentication,因此 B 可能会无意中获取 A 的 cookie。我们知道这不是对网站的攻击。

有没有人经历过类似这种行为的事情?如果是这样,您能否就如何始终如一地重现此问题提供任何建议?

4

7 回答 7

1

我们假设 cookie 在 Response Header 中,并且正在将 Person A 的机器上存在的相同 cookie 写入 Person B。重要的是要注意这个问题发生在 IE 7 中的 Person A 和 FireFox 中的 Person B 上。同样,当人员 A 注销时,人员 B 也已注销,因为 Formsauthentication 票证在服务器上不再有效。所以是的,他们确实有不同的 cookie,但在他们的每个 cookie 中有相同的表单身份验证票。然而,在没有登录的情况下生成了一个。

我们也找到了这篇文章,但无法确认这是否是原因。http://support.microsoft.com/default.aspx?scid=kb;EN-US;917072

我会看看 LiveHTTP 告诉我什么,并会报告回来。谢谢。

于 2008-11-04T22:24:06.000 回答
0

为什么 B 会得到 A 的 cookie?我假设您的意思是人 B 的会话 cookie 与 A 的登录 ID 相关联。这就是问题的关键。

在我看来,A 的登录 ID 被存储在一个可以交叉请求的地方——例如临时文件或数据库中——而没有将其与会话 cookie 关联。(相关问题:页面输出正在被缓存,但没有与会话 cookie 正确关联或检索。)当会话信息被存储或缓存时,它必须与 cookie 关联。考虑属于浏览器的会话数据,而不是登录。

我将安装 Firefox 扩展 LiveHTTP 并检查请求/响应标头。我敢打赌,你会看到 A 和 B 有不同的 cookie,但在服务器上它们都与相同的登录 ID 相关联。

于 2008-11-04T22:17:09.633 回答
0

所有流量都是 SSL...查看 IIS 日志,所有内容都通过端口 443。唯一设置的缓存是在图像上公开,如前所述。我们的假设是这是导致问题的结果输出缓存。

于 2008-11-05T17:31:50.723 回答
0

当然,如果这些图像(以及 CSS 和静态 JS 文件等)没有作为 HTTPS 提供,它们将受到 ISP 或其他代理(实际上是缓存)以及它们的 cookie 的缓存。

有一个类似这样的缓存指令:

Cache-control: no-cache="set-cookie,set-cookie2"

...这应该指示缓存不要缓存“set-cookie”响应标头,但我不确定它的支持范围有多广(尽管它是标准的)。

如果可以,在提供图像时避免使用 set-cookie 响应标头(如果您不能完全控制会话管理,可能并不容易)。如果用户必须通过身份验证才能查看某些图像,那么这些图像无论如何都不应该被公开缓存。

于 2008-11-04T22:33:03.487 回答
0

抱歉,我忘了提到所有流量都通过端口 443 作为 SSL。我们正计划删除为图像设置的 cookie。但是,当所有流量都通过 SSL 处理时,我们并不感到困惑。

于 2008-11-04T22:42:22.580 回答
0

你确定你没有在页面上启用输出缓存之类的东西吗?

于 2008-12-18T23:24:37.713 回答
0

安装 Fiddler 以调查您的 http 请求可能会有所帮助,如上所述。此外,请确认 cookie 是否相同。您的处理程序或表单身份验证系统是否使用静态对象引用?您的代码中可能存在竞争条件。并且没有正确锁定您的资源。

于 2008-12-19T06:08:48.833 回答