【问题标题】:ASP.NET Session Mix-up using StateServer (SCARY!)使用 StateServer 的 ASP.NET 会话混合(可怕!)
【发布时间】:2010-12-11 09:40:05
【问题描述】:

我们在会话中存储了两个对象。不知何故,来自另一个用户的一个对象被加载到另一个用户的会话中。用户应该无权访问这些特定数据,而他们一看到它就知道出了问题。

我们有提供给他的数据的视觉证据,并且肯定除非会话混淆,否则不可能发生。这是一个非常可怕的情况,我们无法弄清楚(我们无法重现它)。对我们来说唯一的答案就是责怪 ASP.NET StateServer 将会话变量混为一谈,这是完全不能接受的,并且让我们处于不利的境地。

我们的应用程序是在带有 IIS6 的 Windows Server 2003 上运行的 ASP.NET 2.0 应用程序,使用 StateServer cookieless="false" 会话模式和 FormsAuthentication。

还有其他人遇到过这个问题吗?我们该如何解决?

【问题讨论】:

  • 我见过这个,但在 .Net 1.1 中。 t 应该是在 2.0 中修复的。在尝试发布答案之前,我有一些问题。第一个问题,您使用的是无 cookie 会话吗?
  • 谢谢!是的,cookieless(它在问题中说)。
  • 抱歉...没看过。由于使用无cookie会话意味着SessionID作为querystring参数包含在URL中,那么当这种情况发生时,您是否验证过两个用户之间URL的SessionID querystring参数不同?
  • 天啊。对不起。它不是无饼干的。我们的会话由 cookie 提供支持。该死的双重否定!!!
  • 好的。我找不到我的原始参考资料。我知道微软曾经修复过这样的错误。我似乎再也找不到文档了。当然,它已经过时了几年。

标签: asp.net security session iis-6 stateserver


【解决方案1】:

我们在我以前的公司遇到过这个确切的问题,并花了 3 周的时间来调试它。 ASP.NET 为用户提供了其他人的会话状态。在调试环境中复制真的是不可能的。

当我们发现它只是 web.config 中的某些内容时的修复。我不完全记得它,所以我花了一些时间谷歌搜索。我相信这个问题与输出缓存有关。查看“会话和输出缓存”下的这篇文章。

http://download.microsoft.com/download/3/a/7/3a7fa450-1f33-41f7-9e6d-3aa95b5a6aea/MSDNMagazineJuly2006en-us.chm(Jeff Prosise 在 2006 年 7 月版的 MSDN 杂志上的文章标题为Keep Sites Smoothly Running By Avoiding The 10 Common ASP.NET Pitfalls

如果这听起来像您的情况,那么修复可能只是禁用 web.config 中的 enableKernelOutputCache 选项。

祝你好运。

【讨论】:

  • 我相信你是对的!事实上,我们确实在 one Web 表单上启用了输出缓存,并且表单是负责填充我们的差异会话变量的表单。你是圣人、学者、绅士、天才,我感激不尽!!
  • +1。尽管 Josh 说只交换了一个变量,而不是整个会话,正如您的链接所指出的那样。
  • 澄清一下,我只有证明一个变量被交换了。
  • 感谢您帮助我确定我没有疯。几个星期以来,我一直在与这样的问题作斗争,我被难住了。我终于在我的异常消息中添加了足够的调试提示,我推断会话正在被跨越。在得出这个结论后,我很高兴能快速找到答案。
  • 我在 IIS 7.5 上也遇到过这个问题(或非常相似的问题)。使用托管 HTTP 模块,有一个 recommendation 在响应 Response.DisableKernelCache() 中显式禁用内核缓存。
【解决方案2】:

【讨论】:

    【解决方案3】:

    有这个问题,原来是部分视图上的OutputCache属性。

    【讨论】:

      【解决方案4】:

      两个交叉用户是否都使用相同的缓存代理?如果是这样,那么如果 URL 匹配,一个用户可能会看到为另一个用户缓存的数据,尤其是在代理行为不佳的情况下。

      这不是 Google Web Accelerator 项目(现已停止)的主要问题吗?

      【讨论】:

        【解决方案5】:

        它发生了多少次?您是否检查了使用浏览器返回的用户或使用会话 ID 相互发送链接?

        确定状态服务器错误的一种方法是切换到另一个会话管理器,如果可以的话回退到进程内或使用 SQL Server,但最好先找到一种方法来重现错误,这样你就可以测试一下。

        【讨论】:

        • 它只发生过一次。浏览器返回绝对不是它,因为用户身份验证在任何时候都不允许访问这些数据。他们也不可能做任何像黑客会话 ID 这样的事情,我们的用户是甚至不知道会话是什么的老商人。
        【解决方案6】:

        首先在您自己的代码中寻找错误 - 这是迄今为止最可能的解释。例如。使用静态字段或其他共享内存,例如 ASP.NET 缓存来存储用户特定的数据。

        【讨论】:

        • 我只是在过去的十天里做这件事。我在我的问题中强调“肯定”这个词是有原因的。相信我,我们的代码是防弹的。
        • 另外,这个应用程序已经投入生产多年,我们只遇到过一次这个问题。
        • +1 每次我看到类似 Josh 所描述的内容,这就是罪魁祸首。
        • “相信我,我们的代码是防弹的。”证据表明并非如此!竞争条件只发生一次这一事实并不一定令人惊讶。
        • 我知道,乔。这就是为什么我挖了又挖了大约 2 周,才最终认输并发布了这个问题。
        猜你喜欢
        • 2013-03-07
        • 2010-11-29
        • 1970-01-01
        • 2011-07-18
        • 2012-01-14
        • 1970-01-01
        • 2012-06-29
        • 2013-09-27
        • 2012-10-08
        相关资源
        最近更新 更多