代码之家  ›  专栏  ›  技术社区  ›  Sam Dufel

php$会话实现

  •  1
  • Sam Dufel  · 技术社区  · 15 年前

    有人知道PHP如何将会话ID映射到$\u会话数组吗?换句话说,给定会话ID x,php从何处提取值来填充$\u会话数组?

    给定会话ID和它来自的URL,有没有可能有人能够访问$\u会话数组中的值?

    6 回复  |  直到 15 年前
        1
  •  3
  •   Powerlord    15 年前

    默认情况下,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 共享内存库,但我相信已经停止使用了。

        2
  •  2
  •   Kel    15 年前

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

        3
  •  2
  •   casablanca    15 年前

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

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

        4
  •  1
  •   NikiC    15 年前

    不,不可能!

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

        5
  •  1
  •   mojuba    15 年前

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

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

        6
  •  0
  •   William Linton    15 年前

    你也可以 write your own 用于将会话保存到数据库的会话处理程序。

    另外,如果您想更难确定会话ID, regenerate the session ID 在战略时期(在特权提升等方面),或者尽可能频繁地。

    通过 session_regenerate_id() 争论 True 销毁旧会话数据。