PHP $ _SESSION实现

时间:2010-10-22 19:05:45

标签: php authentication session-variables

有谁知道PHP如何将会话ID映射到$ _SESSION数组?换句话说,给定会话ID x,PHP从哪里提取值来填充$ _SESSION数组?

根据会话ID及其来自的URL,是否有人能够访问$ _SESSION数组中的值?

6 个答案:

答案 0 :(得分:3)

默认情况下,PHP使用files session handler。这些文件基于session.save_path设置存储,但默认为系统的临时目录(高度不安全的位置,请考虑更改它)

此会话处理程序将每个会话作为序列化PHP数组存储在以会话ID命名的文件中。

如果您可以在会话垃圾收集例程清理之前找到会话ID,则可以将其劫持,因为PHP内部不会进行任何健全性检查。您可能希望通过在会话中存储用户的IP地址并将其与当前IP进行比较来自行完成,如果会话不匹配则清除会话。

session.gc_maxlifetime控制会话被视为有效的秒数。在此之后,每次发生请求时,会话都很少被删除。默认值为1440秒(或24分钟)。

默认情况下,此机会为1%,但可以通过调整session.gc_probabilitysession.gc_divisor值(默认分别为1和100)来更改。

还有其他会话处理程序,例如memcachememcached扩展名中包含的会话处理程序。曾经有一个基于libmm共享内存库,但我相信已经停止了。

答案 1 :(得分:2)

会话信息存储在服务器文件系统中。 php.ini中有配置参数session.save_path。有关会话安全性的一些信息,请参见:http://www.php.net/manual/en/session.security.php

答案 2 :(得分:2)

会话数据通常存储在磁盘上的临时文件中(请参阅session.save_path设置),文件名反映会话ID。

一般情况下,是的,如果某人掌握了另一个用户的会话ID并将其与他自己的请求一起发送,他将获得对该用户会话的访问权限。解决此问题的一种方法是将会话绑定到IP地址,并在请求从不同的地址到达时使会话无效。

答案 3 :(得分:1)

不,没有可能!

...除非您的代码或所使用的任何组件的代码不安全。

答案 4 :(得分:1)

使用会话的默认实现(如果需要可以替换为自定义会话),数据将存储在本地文件中。您的服务器从cookie中的客户端接收会话ID,在服务器上找到相应的本地文件并将数据填充到$ _SESSION。

获取对此数据的访问权限需要在服务器上进行文件级访问,这是不可能的,除非您的服务器足够安全

答案 5 :(得分:0)

您还可以write your own会话处理程序将会话保存到数据库。

此外,如果您想在战略时间(特权提升等)确定会话ID,regenerate the session ID,或者根据需要更频繁地设置会议ID。

传递session_regenerate_id()参数True以销毁旧会话数据。