PHP Session 默认存储在 /var/lib/php/session 或 /tmp。
它的本质是PHP 为了在无状态的 HTTP 协议之上维持用户会话采用了一种基于文件的“键值对”持久化机制。Session ID 是钥匙通常在 Cookie 中而 Session 数据是锁在服务器特定目录下的文件。这个目录的选择直接决定了系统的安全性 (Security)、性能 (Performance)和可维护性 (Maintainability)。如果把 Session 存储比作银行保管箱业务Session ID是你手中的取件凭证Cookie。/tmp是一个公共储物柜区。任何人都能进去看有哪些柜子列出文件虽然打不开你的柜子如果权限正确但能看到柜子的存在、大小、最后修改时间。甚至如果管理员疏忽别人可能撬开你的锁。/var/lib/php/session是一个VIP 专属密室。只有银行职员Web 服务器进程如www-data有钥匙进入。普通客户其他系统用户连门都进不去。核心逻辑默认路径往往是妥协的产物。理解其背后的权衡才能根据业务场景做出最优配置。一、路径差异解析为什么有两个默认值1./tmp(The Universal Temp)来源PHP 编译时的默认配置或者php.ini中session.save_path未设置时的回退行为。特点全局可写所有用户都可以在此创建文件。** Sticky Bit (1777)**通常设置了粘滞位用户只能删除自己的文件不能删除别人的。清理机制系统 cron 任务如tmpwatch会定期清理超过一定时间如 10 天未访问的文件。风险信息泄露攻击者可以ls /tmp看到有多少活跃会话甚至通过侧信道攻击推测用户行为。竞争条件在高并发下多个进程操作/tmp可能导致锁竞争或文件冲突。被清空风险如果系统重启或清理策略激进Session 可能意外丢失。2./var/lib/php/session(The Dedicated Vault)来源Linux 发行版如 CentOS/RHEL, Debian/Ubuntu在安装 PHP 包时为了安全起见特意修改了默认配置。特点专用目录专为 PHP Session 设计。严格权限通常所有者是root组是apache或www-data权限设为1733或770。隔离性其他系统用户无法列出目录内容也无法访问文件。优势安全性高防止会话劫持和信息泄露。可控性管理员可以独立设置该目录的清理策略不影响系统其他临时文件。 核心洞察如果你在生产环境看到 Session 存在/tmp这是一个红色的安全警告信号。请立即将其迁移到专用目录。二、底层存储机制文件里写了什么1. 文件名规则格式sess_SessionID示例sess_5d41402abc4b2a76b9719d911017c592注意Session ID 通常是 32 字符的十六进制字符串MD5 长度或更长。2. 文件内容序列化默认处理器php序列化格式。内容示例user_id|i:123;username|s:5:admin;logged_in|b:1;特点纯文本可读。这意味着如果文件权限泄露攻击者可以直接读取敏感数据如用户名、邮箱。3. 垃圾回收 (Garbage Collection, GC)问题Session 文件不会自动消失除非被删除。机制PHP 每次启动 Session 时有一定概率由session.gc_probability / session.gc_divisor决定触发 GC 进程。动作遍历目录删除最后修改时间超过session.gc_maxlifetime默认 1440 秒 24 分钟的文件。陷阱在高并发网站频繁的 GC 扫描目录会导致严重的 I/O 瓶颈CPU 等待磁盘。如果多个应用共享/tmpPHP 可能会误删其他应用的临时文件或者其他应用删掉 PHP 的 Session。三、安全陷阱Session 文件的阿喀琉斯之踵1. 权限配置错误场景目录权限设为777。后果同一服务器上的恶意用户可以创建同名 Session 文件进行会话固定 (Session Fixation)攻击或者读取其他用户的 Session 数据。最佳实践# 目录权限粘滞位 仅所有者可读写执行chmod1733/var/lib/php/session# 文件权限PHP 创建时通常为 600# 确保 Web 用户是所有者或组成员chownwww-www-data /var/lib/php/session2. 跨站点脚本 (XSS) 窃取 Session ID机制虽然文件在服务器端很安全但如果前端有 XSS 漏洞攻击者可以通过 JS 读取浏览器的 CookieSession ID。防御设置 Cookie 为HttpOnlyJS 不可读。设置 Cookie 为Secure仅 HTTPS 传输。设置SameSite属性。3. 软链接攻击 (Symlink Attack)场景攻击者在/tmp创建一个指向/etc/passwd的软链接命名为sess_evil。后果如果 PHP 以 root 运行绝对禁止写入 Session 时可能会覆盖系统文件。防御永远不要让 Web 服务器以 root 运行。使用专用目录并限制权限。四、高性能替代方案超越文件系统对于高并发应用文件 Session 是性能瓶颈。1. Redis Session Handler (推荐)原理将 Session 数据存储在内存数据库中。优势极速内存读写微秒级响应。共享天然支持负载均衡集群多台 Web 服务器共享同一份 Session。自动过期Redis 的 TTL 机制比 PHP 的 GC 更高效、更准确。配置session.save_handler redis session.save_path tcp://127.0.0.1:6379?authpassword2. Memcached Session Handler原理类似 Redis但功能更简单纯缓存。优势极快适合纯会话存储。劣势不支持持久化重启后数据丢失Session 本来就不该持久化所以这点无所谓。3. 数据库 Session (MySQL/PostgreSQL)原理存入关系型数据库表。劣势慢。每次请求都要执行 SQL 查询。不推荐用于高并发。 总结原子化“Session 存储”全景图维度/tmp/var/lib/php/sessionRedis安全性低 (可见性高)高 (隔离性好)中 (需配置密码/ACL)性能中 (磁盘 I/O, 锁竞争)中 (磁盘 I/O)极高 (内存)扩展性差 (单机)差 (单机)好 (集群共享)GC 机制系统 Cron / PHP GCPHP GCRedis TTL (自动)适用场景开发环境/测试小型生产环境中大型/分布式生产环境隐喻公共储物柜私人保险箱高速缓存层终极心法Session 存储的本质是“状态的外部化”。别把秘密放在广场上 (/tmp)。别把瓶颈留在磁盘上 (File)。对于现代 Web 应用Redis 是 Session 的唯一正解。于文件中见局限于内存中见速度以隔离为基解安全之牛于架构演进中求高效之真。行动指令检查当前配置php -i | grep session.save_path。审计权限ls -ld /var/lib/php/session或ls -ld /tmp。迁移至专用目录如果在/tmp修改php.ini指向/var/lib/php/session并创建目录、设置权限。评估 Redis如果 QPS 100立即规划迁移到 Redis Session。思维升级记住Session 文件是攻击者的金矿。保护好它就是保护用户的身份。