在MVC应用程序中,我有一个两页的过程。在第一页,我们收集信息,以便我们识别要更新的数据库记录。在第二页上,我们收集用于更新此记录的新值。为了实现这一点,我们需要一种方法来在两个页面之间保留信息,包括一些记录ID。
我虽然有两种方法可以做到这一点,但都有一些问题。
将信息存储在Session对象中。
只要用户没有打开第二个浏览器窗口或选项卡,这就有效。如果他这样做,则存在他将修改应用于错误记录的风险。假设他打开标签1并完成第一步。记录ID 1存储在Session对象中。然后用户打开选项卡2并完成第一步。记录ID 2然后存储在Session对象覆盖记录id 1中。然后用户返回第一个选项卡并完成第二步,认为他正在编辑记录1,但实际上他将编辑记录2。
将信息存储在页面上的隐藏字段中。
这将解决问题解决方案1的问题,但对于恶意用户来说,更改记录ID以覆盖任何记录将是微不足道的。
在输入这个问题时,我只是第三个解决方案。这是两个的混合,但我不确定它是完全安全的。我们可以在页面的隐藏字段中存储随机id,并使用它来为我们用于访问会话对象中的数据的密钥添加前缀。我认为这会奏效。这可以被解决,因为解决方案2可以吗?
安全地存储数据“每个标签”而不是“每个会话”的其他好方法吗?
答案 0 :(得分:1)
考虑到方法2,您可以检查安全服务器端。如果用户对特定记录没有修改权限,则服务器不得保存它。否则他/她正在修改一个对其具有修改权限的记录,如果他/她是通过标准UI进行修改或在其下进行黑客攻击,则无关紧要。
答案 1 :(得分:1)
我认为你混淆了两件事 - 授权和传递数据。
如果用户被授权用“另一条记录”做事,那么如果他“缓和隐藏”并不重要,因为他也有权更改另一条记录。没有人会故意这样做。意味着 - 您只需要检查用户是否有权在用户的每个帖子中执行操作,即在每个控制器方法中执行操作(这通常是为了始终验证服务器端的所有用户输入)。
我建议你选择“隐藏的领域”。
答案 2 :(得分:0)
如果您想在不同标签中分隔信息,则应使用每个打开的浏览器标签不同的sessionStorage
。
您可以这样设置:
sessionStorage.setItem("perTabValue", "true");
然后你可以获得你的价值:
var x = sessionStorage.getItem("perTabValue");
if(x === "yourValue"){
//do anithing you want
}