【发布时间】:2010-05-10 10:37:41
【问题描述】:
我正在使用 PHP 中的会话,并且我在单个域上有不同的应用程序。问题是,cookie 是特定于域的,因此会话 ID 会发送到单个域上的任何页面。 (我不知道是否有办法让 cookie 以不同的方式工作)。所以会话变量在这个域的每个页面中都是可见的。 我正在尝试实现自定义会话管理器来克服这种行为,但我不确定我是否考虑正确。
我想完全避免 PHP 会话系统,并创建一个全局对象,该对象将存储会话数据并在脚本结束时将其保存到数据库。
- 在第一次访问时,我会生成唯一的 session_id 并创建一个 cookie
- 在脚本结束时,使用 session_id 保存会话数据、会话开始和上次访问的时间戳,以及来自 $_SERVER 的数据,例如 REMOTE_ADDR、REMOTE_PORT、HTTP_USER_AGENT。
- 在每次访问时检查从客户端发送的 cookie 中的 session_id 数据库,检查 IP、端口和用户代理(出于安全考虑)并将数据读入会话变量(如果未过期)。
- 如果 session_id 过期,从数据库中删除。
那个会话变量将被实现为单例(我知道我会与这个类紧密耦合,但我不知道更好的解决方案)。
我正在尝试获得以下好处:
- 会话变量在同一服务器和同一域上的其他脚本中不可见
- 会话过期的自定义管理
- 查看打开会话的方式(类似于在线用户列表)
我不确定我是否忽略了此解决方案的任何缺点。有没有更好的办法?
谢谢!!
更新: 我没有足够详细地解释它并在这里造成了很多混乱,所以我想更清楚地说明我在处理什么:
我正在构建 SOA 服务器应用程序,它将部署在许多不同的环境中。它没有自己的网络服务器,因此在这些环境中可能会有另一个 PHP 应用程序。这些公司的员工将在此应用程序中拥有用户帐户,因此他们将在此应用程序中获取带有会话 ID 的 cookie。
正如我们所知,在加载会话数据时运行 PHP 的网络服务器并没有区别(至少默认情况下)哪个脚本从哪个目录创建会话。它只需要一个会话 ID。此会话 ID 随从客户端到服务器的每个请求一起发送。从您的回答中,我找到了一种方法,PHP 如何限制某些目录的 cookie,但恶意用户能够编辑 cookie,因为它存储在他的计算机中。在我的情况下,恶意用户可以访问在同一环境中编写和执行 php 脚本,尽管无法访问我的应用程序及其数据库。如果他创建一个脚本,他可以使用我的应用程序的 cookie 中的 Session id,因此他可以读取和编辑我的应用程序上的会话数据并访问我的应用程序的某些部分,他不应该被允许。
我发现在这样的环境中部署应用程序会存在另一个安全威胁,我想要的是我能做的最好的隔离,默认会话处理似乎太危险了,不适合这样的用途。
所以我的问题是,如果你看到的东西在我的设计中不太安全、不太灵活,而不是默认会话管理。
谢谢你的回答,..
【问题讨论】:
-
锁定 IP 地址和端口不是一个好主意。因为通常两者都可以从请求到请求而变化。
-
我不知道端口,但我读过某种 PHP 安全书籍,你不应该允许来自不同 IP 的请求,因为窃取会话 ID 和IP限制应该避免使用这个被盗的id。我知道在某些情况下可能会更改您的 ip,但您知道这些情况是什么情况吗?
-
一些 ISP 为每个请求分配一个新 IP。
-
是的,谢谢,但我认为为更改 IP 的用户设置例外情况可能会更安全,对于 IP 不变的用户来说,禁止 IP 切换应该是件好事。好吧,谢谢,它需要正确调整:)