【问题标题】:Image caching, HTTPHandler and FormsAuthentication图像缓存、HTTPHandler 和 FormsAuthentication
【发布时间】:2010-09-20 18:53:24
【问题描述】:

设置:

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

问题:

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

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

【问题讨论】:

    标签: c# iis cookies


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您确定没有在页面上启用输出缓存之类的功能吗?

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 你确定乙一定获得甲的cookie吗? (您是否在如此详细地跟踪请求?)您的问题听起来好像您已经将其范围缩小到图像,如何/为什么?可能是并发请求或其他类似问题存在线程问题。
        • 请编辑您的原始问题,添加此信息,然后删除这些帖子。原因是问题的答案是唯一应该低于问题的东西。如果您有更多信息,请编辑您的问题或对您的问题发表评论
        【解决方案4】:

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

        【讨论】:

        • 那么,你的主页也是SSL?认证前?
        • ...在 SSL 终止之前您没有自己的缓存?
        • 请编辑您的原始问题,添加此信息,然后删除这些帖子。原因是问题的答案是唯一应该低于问题的东西。如果您有更多信息,请编辑您的问题或对您的问题发表评论。
        【解决方案5】:

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

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

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

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

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

        【讨论】:

          【解决方案6】:

          我们假设 cookie 位于响应标头中,并且正在将 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 告诉我什么,并会报告回来。谢谢。

          【讨论】:

          • 除非这是对问题的答案,否则请编辑您的问题,或直接评论您正在评论的答案。有一个专门用于此目的的“添加评论”字段。
          【解决方案7】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-30
            • 2012-06-02
            • 1970-01-01
            • 1970-01-01
            • 2011-10-15
            • 2018-10-25
            相关资源
            最近更新 更多