使用可变会话数据是否安全


Is it safe to use variable session data?

我有一个(希望)关于会话的快速问题。虽然我广泛使用了会话,但我没有在值根据用户操作而变化的情况下使用会话。

登录到我的应用程序后,用户可以选择一个公司区域,该区域有许多级别的页面和文件夹。所有这些页面都需要这个"company_id"。目前,我通过GET发送company_id,但随着我深入应用程序,这变得越来越难以维护,URL中存储了各种其他数据。

因此,当用户选择他们的公司时,我可以在$_SESSION数组中设置他们的company_id。但是,当用户更改公司时,我需要将$_SESSION['company_id']更改为新值。

这是对会话的良好利用吗?我可以通过使用会话数据而不是总是使用GET来清理我的url,但我不确定这是否是推荐的使用会话的方式。

提前感谢

这是HTTP设计理念的一个糟糕实现。所有HTTP请求都应该是自包含RESTful。获取特定页面所需的所有信息都应存在于请求本身(URL、标头和正文)中,而不依赖于隐藏状态

超级琐碎的例子:你不能把URL复制到某个地方或其他人,然后让他们看到同一个页面。页面的内容取决于会话状态,会话状态是通过前几个页面的访问历史精心设置的。要返回到同一页面,您需要重新执行相同的步骤,重新创建一些隐藏的服务器端状态以到达同一页面。

如果考虑到访问者可能希望在两个或多个同时出现的选项卡/窗口中打开需要不同状态的页面,这将变得更加复杂和混乱。

所有这些并不是说它不能工作,只是它非常复杂,会破坏浏览器通常的预期行为,除非你真的竭尽全力阻止它。

如果许多级别的页面和级别是每个公司的,您可以将company_id放在一个特定的包含文件中-该网站的这一部分专门用于给定的公司。

然而,如果它们被多家公司共享,并且这可能是你想要的,这可能会产生误导,甚至是危险的,这取决于用户的操作,因为用户可能会跳转到给定的页面(链接…),并访问一个包含意外数据的页面,该数据链接到会话或cookie提供的ID的公司。

您可以根据ID在页面上动态构建链接,以确保从页面导航期间的一致性。任何直接"跳转"到网站另一部分的操作都不会附带ID(页面可能会提供选择公司的选项)。

根据您的网络服务器,如果您可以控制它,您可以构建具有"公司ID"作为URL路径元素的URL,而不是GET参数

例如

http://example.com/invoicing/company382/listprices.php

使用重写(网络服务器配置)将实际使用的URL更改为

http://example.com/invoicing/listprices.php?compid=company382

(用户不可见的URL),该URL通过GET参数通知公司ID。