防止会话变量在新选项卡中被覆盖

Prevent session variables from being overwritten in new tabs

我继承了一个旧的 ASP.Net Webforms 应用程序,它大量使用会话变量来存储用户提交的应用程序的数据库记录 ID。这导致了一些严重的问题,用户在多个选项卡中打开不同应用程序的表单,无意中用另一个应用程序的数据覆盖了一个应用程序中的信息。

整个应用程序的常见用法如下所示:

// Get the application ID from the database
var appID = Convert.ToInt32(Session["appID"]);

// Update application using the above ID
UpdateDB("UPDATE Application SET Title='MY TITLE' WHERE id=" + appID);

// Redirect to another step of the form
Response.Redirect("/application/step-2");

由于此问题在应用程序的多个页面中持续存在,因此我找到的解决方案并不理想(在本文末尾有详细说明 post)。

我的问题:有什么方法可以防止新选项卡覆盖现有会话变量,而不必在整个应用程序中重写会话访问权限?

以下是我发现的解决方案,由于需要更改应用程序的数量,这些解决方案更不是最后的选择:

*以上解决方案是在相关的post上找到的:asp.net - session - multiple browser tabs - different sessions?

听起来 AppID 在逻辑上不是您会话的 属性。它是页面的 属性,或者可能是工作流程的。

如果您需要存储一个 属性 在回发之间持续存在的页面,您可以这样存储它:

this.ViewState["AppID"] = appID;

并执行更新

var appID = (int)ViewState["appID"]
UpdateDB("UPDATE Application SET Title='MY TITLE' WHERE id=" + appID);

一定要secure your ViewState,否则恶意用户可能会篡改 AppID 并更新其他人的记录。

ViewState 存储在页面本身中,因此不会在选项卡之间泄漏。

听起来重写代码以将数据存储在会话以外的其他地方是不可行的。

如果情况确实如此,也许您最简单的选择是向您的站点添加代码,以便在用户在第二个选项卡中打开站点时显示错误,或者如果 activity 在不同的选项卡中修改AppID.

完全防止多个选项卡

这是一种高级方法:

  1. 将代码添加到 Application_EndRequest 以输出一个 "microsession" cookie,其中包含每个页面的时间戳或随机随机数。注意:您必须注意不要为资源请求输出此 cookie,例如图片或 CSS。只有当当前请求是一个页面时才输出。

  2. 将 javascript 的片段添加到您的 common.js 文件(或任何位置将导致它为您站点中的每个页面 运行 ),它执行以下:

    一个。在页面加载时,获取微会话 cookie 并将其值存储在 Javascript 变量

    b。偶尔检查微会话 cookie 以查看它是否已更改。您可以使用计时器来执行此操作,或者您可以只检查用户何时提交任何表单。请注意,某些设备会在选项卡失去焦点时暂停脚本,因此如果您使用计时器,还应检查选项卡何时再次获得焦点。

    c。如果 cookie 已更改,则意味着用户从您的站点请求了一个页面,但在不同的选项卡中。显示错误。到那时,您可以强制他们注销或只是 Session.Abandon() 并将他们重定向到主页,在那里将自动为他们构建一个新的、干净的会话。

允许多个选项卡,只要 AppID 不变

如果您想允许多个选项卡并且只是想在 AppID 发生意外更改时导致错误,您可以将微会话 cookie 设置为 AppID 的哈希值而不是随机数。这样,错误只会在 AppID 更改时触发。如果您需要检查多个会话变量,您可以在生成哈希之前将它们连接起来(字符串连接很好)。