“如何存储信息”;“每浏览器”选项卡;在ASP.NETMVC中?

“如何存储信息”;“每浏览器”选项卡;在ASP.NETMVC中?,asp.net,asp.net-mvc,asp.net-mvc-4,Asp.net,Asp.net Mvc,Asp.net Mvc 4,在MVC应用程序中,我有一个两页的进程。在第一页中,我们收集信息,这些信息将允许我们确定要更新的数据库记录。在第二页,我们收集用于更新此记录的新值。为了让它工作,我们需要一种在两个页面之间持久化信息的方法,包括一些记录id 我想到了两种方法,但都有一些问题 将信息存储在会话对象中 只要用户不打开第二个浏览器窗口或选项卡,此功能就可以工作。如果他这样做了,他就有可能将修改应用到错误的记录上。假设他打开选项卡1并完成第一步。记录id 1存储在会话对象中。然后,用户打开选项卡2并完成第一步。然后,记录

在MVC应用程序中,我有一个两页的进程。在第一页中,我们收集信息,这些信息将允许我们确定要更新的数据库记录。在第二页,我们收集用于更新此记录的新值。为了让它工作,我们需要一种在两个页面之间持久化信息的方法,包括一些记录id

我想到了两种方法,但都有一些问题

  • 将信息存储在会话对象中

    只要用户不打开第二个浏览器窗口或选项卡,此功能就可以工作。如果他这样做了,他就有可能将修改应用到错误的记录上。假设他打开选项卡1并完成第一步。记录id 1存储在会话对象中。然后,用户打开选项卡2并完成第一步。然后,记录id 2存储在会话对象中,覆盖记录id 1。然后,用户返回到第一个选项卡并完成第二步,认为他正在编辑记录1,但实际上他将编辑记录2

  • 将信息存储在页面上的隐藏字段中

    这将解决解决方案1的问题,但对于恶意用户来说,更改记录id以覆盖任何记录是微不足道的

  • 在打这个问题时,我想到了第三种解决方案。这是两者的混合,但我不确定它是否完全安全。我们可以将一个随机id存储在页面上的一个隐藏字段中,并使用它作为用于访问会话对象中数据的密钥的前缀。我想这会管用的。这是否可以像解决方案2那样加以利用


    安全存储数据的其他好方法是“每个选项卡”而不是“每个会话”?

    如果您想在不同的选项卡中分离信息,您应该为每个打开的浏览器选项卡使用不同的信息

    您可以这样设置:

    sessionStorage.setItem("perTabValue", "true");
    
    然后您可以获得您的价值:

    var x = sessionStorage.getItem("perTabValue");
    if(x === "yourValue"){
      //do anithing you want
    }
    

    考虑到方法2,您可以检查服务器端的安全性。如果用户对特定记录没有修改权限,则服务器不得保存该记录。否则,他/她正在修改对其具有修改权限的记录,而不管他/她是通过标准用户界面还是在其下进行黑客攻击。

    我认为您混淆了两件事-授权和传递数据

    如果用户被授权使用“另一个记录”进行操作,那么他是否“调整隐藏的内容”并不重要,因为他也被授权更改另一个记录。没有人会故意这么做。意味着-您只需要检查用户是否有权在用户的每篇文章中(即在每个控制器方法中)执行操作(这是通常的做法,总是在服务器端验证所有用户输入)


    我建议您选择“隐藏字段”。

    我想我需要存储在服务器端的信息,这样用户就无法忍受了。我认为唯一的方法是通过ajax将信息发送到服务器。