1

我有一个 ASP.NET 应用程序,它使用 Session.SessionID 来防止多个用户同时查看相同的数据。

我有一个表,其中包含一组需要处理的图像(存储在 BLOB 中)。应该只有一个用户能够同时查看相同的图像。为了实现这一点,当用户检索每条记录时,记录会使用 Session.SessionID 进行更新。此更新发生在 ReaderWriterLock 内。

我已经进行了测试以确保 ReaderWriterLock 正常工作,并且可以确认只有一个会话可以一次执行该块内的代码。

我目前的理论是两个不同的用户同时获得相同的 SessionID。此应用程序的用户可以查看他们已锁定的记录或任何未锁定的图像。

我已经修改了应用程序以在每个页面的页脚中显示 SessionID,以便如果问题再次发生,我可以检查 SessionID 值。

我在网上看到一些文章暗示 SessionID 不是唯一的,也有人说 SessionID 是唯一的。我知道 SessionID 不是永远唯一的,但是 SessionID 值对于活动会话可以被认为是唯一的吗?

这个论坛描述了一个类似的问题

我还阅读了一些建议,即应该将 Guid 存储在 Session 对象中并用作唯一 ID 而不是 Session ID。

感谢您到目前为止的回复。这是基于迄今为止的答案的澄清:

“永远锁定” - 我们通过 5 分钟的锁定超时来防止这种情况。在用户锁定图像之前,在 ReaderWriterLock 内部,我们会“清理”旧锁(解锁锁定超过 5 分钟的图像),查询以获取最旧的解锁图像,并使用更新语句“锁定”该图像图像到当前会话。

问题的一个可能原因是,如果一个用户“锁定”了一张图像,但随后离开 PC 短暂休息。如果他们在 5 分钟内什么都不做,则屏幕上的图像将被解锁并可能被另一个用户打开。我在报告问题时提到了这种情况,我确信用户一直在持续工作。

“不同的窗口/选项卡” - 我实际上并没有亲眼看到错误,但报告问题的人告诉我,这是两台不同的 PC 和登录用户的两个不同用户名。

希望现在我在页面上显示会话 ID,下次发生这种情况时,我将能够肯定地说两台机器上的会话 ID 是否相同,或者是否是其他问题。此问题在测试阶段从未发生过,因此它似乎是大量并发用户的症状。

感谢您到目前为止的回复,随着更多信息的到来,我会更新这个问题。

似乎用户没有给我完整的故事。根据接受的答案,在我们的案例中,会话 ID 是唯一的。两个用户能够同时看到相同的图像,因为用户 1 在 5 分钟的“废弃图像”解锁过程中处于空闲状态。已提高“废弃图像”超时以匹配会话超时以避免此问题。

4

4 回答 4

3

就 ASP.NET 分配的每个用户而言,会话 ID 是唯一的,尽管这并不能保证防止恶意用户(用户可以手动复制他们分配的 ID 并将其提供给其他人)。

您可能在这里看到的是来自同一用户的多个选项卡或窗口,因为用户一次发出多个请求是完全有效的。

为了做你想做的事,我不得不问 - 你怎么知道用户何时停止查看图像,所以你可以解锁它。如果我查看图像,然后只是关闭浏览器而不是转到另一个页面/图像,它是否仍然锁定到我的(永远丢失的)会话 ID?

如果您使用某种结帐方案 - 用户必须有意签出并签入图像,那么您可能应该为该结帐使用唯一编号(新 Guid),而不是整个用户。

于 2009-02-26T12:05:24.333 回答
2

红旗这里的人。

是的,您可以,但绝对必要的是,您不能或至少使将来尽可能难以重复使用它们。

这取决于您的服务器端应用程序处理会话 ID 和维护状态的程度。您应该(实际上必须)考虑限制 session_ID 的生命周期,以及如何处理身份验证/授权状态。

我在一家排名前 10 的投资银行的关键交易平台上看到,您可以在其中动态捕获会话 ID(包含授权权限)并重新使用它们(通过 ParosProxy.org 的 Paros 等工具)以执行数百万美元代表他人进行交易。在当前的气候下——这是一个问题吗?;-) 抱歉——尽管我很想给这些小丑点名和羞辱,但我不会。

这种情况的可能性有多大?您可以在交换网络上捕获会话 ID 吗?当然,在本地 VLAN 中使用黑客工具 CAIN 并利用 ARP 中毒是可以的。

在编写不佳的服务器端应用程序中,您还可以预测会话 ID。检查工具 WebScarab(在任何 Pen Testers 军械库中)。这将检测 ID 的随机性。在具有另一个关键应用程序的同一家银行,您可以生成自己的会话 ID 来访问和交易应用程序。他们的重点是低延迟(这对业务至关重要)而不是安全性。

可以在 Owasp.org 找到介绍

诺莉·邓恩

于 2009-02-26T13:09:28.363 回答
1

此链接表示会话 ID 是唯一的 - http://support.microsoft.com/kb/899918

会话 ID 是唯一的,因为在任何给定时间只有 1 个会话将拥有该 ID。

如果不是这样,我想会有很多人大声喊叫。

于 2009-02-26T10:53:23.713 回答
1

会话 ID 几乎肯定对用户来说是唯一的。今天,几个用户共享一个 SessionID 的故障模式非常非常罕见。但是,用户可以做几件事来创建您所看到的效果。

例如,用户可以在她的浏览器中打开多个选项卡。这些选项卡都将共享相同的会话 ID。因此,如果她在这些浏览器选项卡之间来回切换,它可能会产生您所看到的效果。

另一个问题是用户经常双击按钮和链接。这意味着处理请求可能会使用相同的会话 ID 发出两次。我会先检查这种可能性。

于 2009-02-26T11:39:35.473 回答