2

我了解 Session 对象用于存储每个会话的数据。我做了以下实验:

  1. 打开浏览器并访问一个 aspx 页面 A,其中保存了一些数据到 Session 对象。
  2. 保持浏览器打开并打开另一个选项卡以访问显示会话数据的 aspx 页面 B。它显示的就像我在步骤 1 中存储的一样。
  3. 我关闭浏览器并重新访问页面B,存储的数据消失了。

从 3 开始,服务器端似乎以某种方式检测到我(客户端)已经终止了会话。但是当我检查 Fiddler 时,当我在步骤 3 中关闭浏览器时,没有任何位发送到服务器。

那么 ASP.NET 应用程序怎么可能知道我的第 3 步请求是针对新会话的呢?

以及如何定义会话?不同的选项卡是否总是属于同一个会话?

加 1

虽然会话数据可以显示在页面 A 和页面 B 中,但它们显示的会话 ID 是不同的。为什么?

正确的

页面 A 和页面 B 中的会话 id 相同。我没有使用 InPrivate 浏览。

添加 2

会话 ID 确实有一个 Cookie:

ASP.NET_SessionId=lmswljirqdjxdfq3mvmbwroy; path=/; domain=localhost; HttpOnly

它是在响应 POST 请求时设置的。

所以我做了另一个实验,我关闭了浏览器(Fire Fox),正如预期的那样,Cookie 不再存在。我手动创建了 cookie,希望“伪造的 Cookie 可以恢复旧会话。 ”但 Fiddler 表示手动 cookie 根本没有发送。

提琴手 说:

This request did not send any cookie data.

那么是否可以伪造 cookie 并恢复之前的会话?

会话在服务器上存在多长时间?

4

2 回答 2

7

当服务器启动一个新会话时,它会为该会话生成一个新的标识符。会话数据存储在会话提供程序中的此标识符/键下(可以在内存中、在 SQL Server 中或完全在其他东西中,具体取决于您的配置 - 这通常在 web.config 中进行配置)。

同时,服务器会向您的浏览器发送一个 cookie(至少在默认设置中)。此 cookie 包含您的会话的标识符。这就是服务器如何将您的请求与您的特定会话相关联:在每个请求中,您的浏览器都会发送会话 cookie。服务器从 cookie 中检索标识符并使​​用该标识符查找您的会话数据。

会话 cookie 是非持久性的,这意味着当浏览器关闭时 cookie 将被删除。这就是looks like会话被删除的原因:会话数据仍然存在于服务器上,但是由于会话cookie已被删除,浏览器不会发送会话cookie,因此服务器会认为这是一个开始新会话,创建新会话标识符等。因此,服务器并不真正知道会话何时结束,它只知道会话何时开始。这就是为什么在默认 SQL Server 支持的设置中,计划作业将清除非活动会话 - 否则会话数据将永远留在数据库中。

有关会话、使用不带 cookie 的会话、会话配置、提供程序等的更多信息,请参阅MSDN

至于会话是否在浏览器选项卡之间共享:这实际上归结为 cookie 是否在选项卡之间共享。我认为 cookie 在所有主要浏览器中的选项卡之间共享,我认为如果不是这样会相当混乱,但是没有什么能阻止某人创建一个不跨选项卡共享 cookie 的浏览器。

编辑 1

如果您删除会话 cookie,理论上您可以通过重新创建 cookie 来重新创建会话。这本身不是安全问题,因为您正在重新创建您已经可以访问的数据。但是,如果其他人要重新创建您的会话 cookie,那将是一个安全问题。如果您想对此进行调查,可以搜索“ASP.NET 会话劫持”。

编辑 2

会话基本上存在于服务器上,直到有东西清除它。因此,会话的生命周期取决于您存储它的位置。如果你把它存储在内存中,当应用程序被回收时,会话将被删除(可能是因为你在 IIS 中回收了应用程序,也可能是因为服务器重新启动)。如果将其存储在 SQL Server 中,会话数据将一直存在,直到作业将其删除,因为它已经有一段时间没有被访问了(对不起,我不记得细节,但你可能可以用谷歌搜索它们)。如果将会话数据存储在 Azure 表存储中,它们可能永远不会被清除。

笔记

ASP.NET 会话状态的两个重要细节经常被忽视:

  1. 当会话存储在进程之外(例如,在 SQL Server 中)时,您要存储的数据必须是可序列化的。
  2. 为了防止访问会话数据时出现竞争条件,访问会话的请求将被序列化,即它们不会并发执行。

更多详细信息可以在MSDN 文章“ASP.NET 中会话状态实现的基础”中找到

于 2014-07-16T13:44:36.180 回答
1

本文提供了有关 ASP.NET 会话的更多详细信息 ( http://msdn.microsoft.com/en-us/library/vstudio/ms178581(v=vs.100).aspx )

这个想法很简单。

  1. 当您访问一个页面时,会生成一个会话 ID 并将其设置为 cookie。也会为该会话 ID 启动一个计时器。
  2. 当您不断返回时,计时器会重置。如果您在请求另一个页面之前等待足够长的时间,则计时器将到期并且您的会话将无效。此时将生成一个新会话。

回答您的问题:如果您打开多个选项卡,它们将“共享”会话。因为您的浏览器正在从所有这些选项卡发送会话 cookie。但是,如果您打开 Firefox 和 Chrome。这两个浏览器不会共享会话。因为,他们不共享cookies。

当您关闭浏览器时,您的会话仍然有效。如果您在会话过期之前访问网站上的页面,您将不会获得新的会话。因此,建议始终注销。这样,站点就知道您要离开了,它会代表您销毁会话。

Q:虽然A页和B页都可以显示会话数据,但是它们显示的会话ID是不同的。答:你确定吗?所有页面的会话 ID 应该相同。如果您从一个浏览器访问页面 A 而从另一个浏览器访问页面 B,情况会有所不同。

添加2

您的浏览器设置可能是在关闭窗口时销毁 cookie。请仔细检查选项中是否设置为记住历史记录。

Cookie 可以伪造。如果攻击者可以获取会话 ID,他们就可以在他们的最后伪造一个 cookie。我不确定 Fiddler 是否允许您手动创建 cookie。您将需要深入研究文档。或者也许这里的其他人可以回答这个问题。

于 2014-07-16T13:53:57.587 回答