有谁知道PHP如何将会话ID映射到$ _SESSION数组?换句话说,给定会话ID x,PHP从哪里提取值来填充$ _SESSION数组?
根据会话ID及其来自的URL,是否有人能够访问$ _SESSION数组中的值?
答案 0 :(得分:3)
默认情况下,PHP使用files
session handler。这些文件基于session.save_path
设置存储,但默认为系统的临时目录(高度不安全的位置,请考虑更改它)
此会话处理程序将每个会话作为序列化PHP数组存储在以会话ID命名的文件中。
如果您可以在会话垃圾收集例程清理之前找到会话ID,则可以将其劫持,因为PHP内部不会进行任何健全性检查。您可能希望通过在会话中存储用户的IP地址并将其与当前IP进行比较来自行完成,如果会话不匹配则清除会话。
session.gc_maxlifetime
控制会话被视为有效的秒数。在此之后,每次发生请求时,会话都很少被删除。默认值为1440秒(或24分钟)。
默认情况下,此机会为1%,但可以通过调整session.gc_probability
和session.gc_divisor
值(默认分别为1和100)来更改。
还有其他会话处理程序,例如memcache或memcached扩展名中包含的会话处理程序。曾经有一个基于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
以销毁旧会话数据。