防止会话变量在新选项卡中被覆盖
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)。
我的问题:有什么方法可以防止新选项卡覆盖现有会话变量,而不必在整个应用程序中重写会话访问权限?
以下是我发现的解决方案,由于需要更改应用程序的数量,这些解决方案更不是最后的选择:
将ViewState("_PageID")
添加到会话变量
使用无 cookie 会话(存储在 URL 中)
*以上解决方案是在相关的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.
完全防止多个选项卡
这是一种高级方法:
将代码添加到 Application_EndRequest 以输出一个 "microsession" cookie,其中包含每个页面的时间戳或随机随机数。注意:您必须注意不要为资源请求输出此 cookie,例如图片或 CSS。只有当当前请求是一个页面时才输出。
将 javascript 的片段添加到您的 common.js 文件(或任何位置将导致它为您站点中的每个页面 运行 ),它执行以下:
一个。在页面加载时,获取微会话 cookie 并将其值存储在 Javascript 变量
中
b。偶尔检查微会话 cookie 以查看它是否已更改。您可以使用计时器来执行此操作,或者您可以只检查用户何时提交任何表单。请注意,某些设备会在选项卡失去焦点时暂停脚本,因此如果您使用计时器,还应检查选项卡何时再次获得焦点。
c。如果 cookie 已更改,则意味着用户从您的站点请求了一个页面,但在不同的选项卡中。显示错误。到那时,您可以强制他们注销或只是 Session.Abandon()
并将他们重定向到主页,在那里将自动为他们构建一个新的、干净的会话。
允许多个选项卡,只要 AppID 不变
如果您想允许多个选项卡并且只是想在 AppID 发生意外更改时导致错误,您可以将微会话 cookie 设置为 AppID 的哈希值而不是随机数。这样,错误只会在 AppID 更改时触发。如果您需要检查多个会话变量,您可以在生成哈希之前将它们连接起来(字符串连接很好)。
我继承了一个旧的 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)。
我的问题:有什么方法可以防止新选项卡覆盖现有会话变量,而不必在整个应用程序中重写会话访问权限?
以下是我发现的解决方案,由于需要更改应用程序的数量,这些解决方案更不是最后的选择:
将
ViewState("_PageID")
添加到会话变量使用无 cookie 会话(存储在 URL 中)
*以上解决方案是在相关的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.
完全防止多个选项卡
这是一种高级方法:
将代码添加到 Application_EndRequest 以输出一个 "microsession" cookie,其中包含每个页面的时间戳或随机随机数。注意:您必须注意不要为资源请求输出此 cookie,例如图片或 CSS。只有当当前请求是一个页面时才输出。
将 javascript 的片段添加到您的 common.js 文件(或任何位置将导致它为您站点中的每个页面 运行 ),它执行以下:
一个。在页面加载时,获取微会话 cookie 并将其值存储在 Javascript 变量
中b。偶尔检查微会话 cookie 以查看它是否已更改。您可以使用计时器来执行此操作,或者您可以只检查用户何时提交任何表单。请注意,某些设备会在选项卡失去焦点时暂停脚本,因此如果您使用计时器,还应检查选项卡何时再次获得焦点。
c。如果 cookie 已更改,则意味着用户从您的站点请求了一个页面,但在不同的选项卡中。显示错误。到那时,您可以强制他们注销或只是
Session.Abandon()
并将他们重定向到主页,在那里将自动为他们构建一个新的、干净的会话。
允许多个选项卡,只要 AppID 不变
如果您想允许多个选项卡并且只是想在 AppID 发生意外更改时导致错误,您可以将微会话 cookie 设置为 AppID 的哈希值而不是随机数。这样,错误只会在 AppID 更改时触发。如果您需要检查多个会话变量,您可以在生成哈希之前将它们连接起来(字符串连接很好)。