两个机器上的ASP.NET会话ID可以同时相同吗?

时间:2009-02-26 10:23:53

标签: asp.net session session-state

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

我有一个表,其中包含一组需要处理的图像(存储在BLOB中)。只有一个用户可以同时查看同一图像。为实现此目的,当用户检索每条记录时,使用Session.SessionID更新记录。此更新发生在ReaderWriterLock中。

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

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

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

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

This forum describes a similar problem

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

感谢目前为止的回复。以下是基于目前答案的澄清:

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

问题的一个可能原因是,如果一个用户“锁定”图像但是然后离开PC进行短暂休息。如果他们在5分钟内没有做任何事情,那么该屏幕上的图像将被解锁并可能被其他用户打开。我在报告问题并且确信用户一直在不断工作时提到了这种情况。

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

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

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

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

4 个答案:

答案 0 :(得分:3)

每个用户的会话ID都是唯一的,只要ASP.NET分配它们,虽然这不是对恶意用户的保证(用户可以手动复制他们已分配的ID并将其提供给其他人)。

您可能会看到来自同一用户的多个标签或窗口,因为它对于用户一次制作多个请求完全有效。

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

如果您正在使用某种结帐方案 - 用户必须有意识地检出并签入图像,那么您应该使用唯一的号码进行结账(新Guid),而不是整个用户。

答案 1 :(得分:2)

这里有红旗人。

是的,你可以,但绝对必要的是你不能或者至少使它在将来重新使用它们变得困难。

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

我在十大投资银行的关键交易平台上看到,您可以动态捕获会话ID(包含授权的权限)并重新使用它们(通过ParosProxy.org的Paros等工具)来执行代表别人进行数百万美元的交易。在目前的气候下 - 这是一个问题吗? ;-)对不起 - 就像我喜欢的名字一样羞辱这些小丑,我不会。

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

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

可以在Owasp.org找到介绍

Noelie Dunne

答案 2 :(得分:1)

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

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

如果不是这种情况,我认为会有很多人大声喊叫。

答案 3 :(得分:1)

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

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

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