Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用可变会话数据安全吗?_Php_Session - Fatal编程技术网

Php 使用可变会话数据安全吗?

Php 使用可变会话数据安全吗?,php,session,Php,Session,我(希望)有一个关于会议的快速问题。虽然我广泛使用了会话,但我没有在值随用户操作而变化的情况下使用它们 在登录到我的应用程序后,用户可以选择一个公司区域,该区域有许多级别的页面和文件夹。所有这些页面都需要此“公司id”。目前,我通过GET发送公司id,但随着我对应用程序的深入,这变得越来越难以维护,URL中存储了各种其他数据 因此,当用户选择他们的公司时,我可以在$会话数组中设置他们的公司id。但是,当用户更改公司时,我需要将$\u SESSION['company\u id']更改为新值 这是

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

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

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

这是会话的一个很好的用途吗?我可以通过使用会话数据而不是总是使用GET来清理我的URL,但我不确定这是否是一种推荐的会话使用方式


提前感谢

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

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

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

所有这一切并不是说它不能工作,只是说它非常复杂,会破坏浏览器通常的预期行为,除非你真的竭尽全力以某种方式防止这种情况发生。

如果每个公司都有很多级别的页面和级别,你可以把公司id放在一个特定的包含文件中——这部分网站是专门为一个给定的公司提供的

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

您可以基于ID在页面上动态构建链接,以确保从页面导航期间的一致性。任何直接“跳转”到网站的另一部分都不会携带ID(页面可能会提供选择公司的功能)

根据您的web服务器以及您对它的控制,您可以构建包含“company ID”作为URL路径元素的URL,而不是GET参数

乙二醇

使用重写(web服务器配置)更改要实际用于

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

(用户看不到URL)通过GET参数通知公司ID。

完美使用会话数据在会话中隐藏URL数据是一种垃圾做法。如果有人需要访问多家公司,该怎么办。如果有人想分享链接怎么办?@PeeHaa我明白你的意思。然而,应用程序不可能允许用户同时查看多个公司,这些都是应用程序的页面而不是公共站点,URL也永远不会被删除shared@PeeHaa但是,还有别的办法吗?Sessions、GET或POST似乎是唯一的选项,POST与您提到的限制相同,而且您必须在每个页面上使用表单!“并且URL永远不会被共享”好的,那么你要亲自在每个客户端检查这个问题吗?公认的答案是2个选项卡/窗口的问题是不实施的突出原因。谢谢嗨@deceze,我很感激在这里度过了相当长的时间!但是,对于使用HTML会话存储来解决OP中的问题,您有何想法?谢谢你指的是HTML5本地存储之类的?同样的事情。存储状态的位置并不重要,URL外部存在状态这一事实会影响默认的浏览器行为和期望。使用Javascript驱动的应用程序,并接受这样一个事实:如果确实有必要,您无法深入链接到特定内容……我明白了,但对于一个复杂的web应用程序(而不是网站本身),您和只有您可以访问“您的数据”,并且我需要在这个实例中存储的数据在浏览时无论如何都会更改(我想说的是,我永远不会期望通过url直接访问某个页面)这仍然是一个糟糕的实现吗?好吧,再一次,浏览器历史记录、后退/前进和多个选项卡都会出错。你自己决定。-一个解决方案实际上是使用唯一id将所有状态变量保存在某个地方(例如会话)(每个可能的状态都有一个唯一的id)并在URL中使用该id。本质上,将变量存储从URL外部化到会话。每个页面仍然有一个唯一的URL,但URL很短。但是使用了大量服务器端存储。这非常有帮助,特别是对于重写的想法,这将使URL更漂亮。
http://example.com/invoicing/listprices.php?compid=company382