PHP 8.3 要求显式设置 session.hash_function(如 sha256),废弃 entropy 配置,自定义 ID 必须实现 SessionIdInterface,且需注意 sid_bits_per_character 对字符集和长度的影响。

session.hash_function 配置项必须显式设置
PHP 8.3 默认仍用 md5(即值 0)生成会话 ID,但该行为不再隐式生效——若 php.ini 中完全注释掉 session.hash_function,PHP 会回退到弱兼容模式,可能触发不一致的哈希结果或日志警告。必须手动指定一个明确支持的算法。
可用值包括:0(MD5)、1(SHA-1),或任意 hash_algos() 返回的算法名,如 sha256、sha384。推荐直接写算法名而非数字,避免语义模糊:
session.hash_function = sha256
- 不建议用
md5或sha1:已被证明存在理论碰撞风险,且 PHP 官方文档已标记为“不推荐” -
sha256是当前最稳妥的平衡点:强度足够、性能开销低、全平台兼容 - 若启用
session.use_strict_mode = 1(强烈建议),则 hash 函数变更会导致旧会话 ID 被拒绝,这是预期行为,不是错误
session.entropy_length 和 session.entropy_file 不再有效
PHP 8.3 彻底移除了 session.entropy_length 和 session.entropy_file 这两个配置项。它们早在 7.1 就被标记为 deprecated,现在读取时会被忽略,且不会报错——这意味着你无法再通过配置文件“增强随机源”,所有熵值均由 PHP 内部 CSPRNG(random_bytes())统一提供。
换句话说:只要没降级到 PHP
立即学习“PHP免费学习笔记(深入)”;
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 检查是否残留:运行
php --ini找到生效的 php.ini,搜索entropy,删掉整行 - 验证是否生效:调用
session_create_id()生成几个 ID,观察长度是否稳定(sha256对应 64 字符) - 不要试图用
session_id(bin2hex(random_bytes(32)))手动覆盖——这绕过 PHP 的严格模式校验,反而削弱安全性
自定义会话 ID 生成器必须实现 SessionIdInterface
PHP 8.3 不再接受通过 session_id() + 自定义字符串拼接来“模拟”新生成器。若需完全接管 ID 生成逻辑(例如绑定业务 UID、接入外部 ID 服务),唯一合规方式是实现 SessionIdInterface 并传给 session_set_save_handler()。
核心限制在于:PHP 8.3 要求自定义生成器必须能响应 create_sid() 方法,并保证返回值符合 session.sid_bits_per_character 和字符集约束(仅限 a–z、A–Z、0–9、,、-)。
- 错误做法:
session_id('user_'.$uid.'_'.time());—— 会跳过所有安全校验,且在use_strict_mode=1下直接失败 - 正确路径:写一个类实现
SessionIdInterface,在create_sid()中调用hash_hmac('sha256', $input, $key)等可控逻辑 - 注意:自定义生成器不影响
session.hash_function,后者只作用于 PHP 原生生成路径
session.sid_bits_per_character 影响最终 ID 长度与字符集
这个参数常被忽略,但它直接决定生成的会话 ID 是否能在 URL、Cookie、日志中安全传输。PHP 8.3 默认值为 6,对应 Base64 编码子集(a–z、A–Z、0–9、,、-),共 64 个字符;若设为 5,则退化为 Base32(仅大写字母+数字),ID 变长但更兼容老旧系统。
修改它会改变 session_create_id() 输出长度,且影响 session_id() 输入校验——比如设为 5 后,传入含小写字母的 ID 会被拒绝。
- 生产环境建议保持默认
6:兼容性好,长度适中(sha256→ 64 字符),无特殊字符 - 调试时可临时设为
4(Base16/Hex)便于肉眼比对,但切勿上线 - 修改后务必测试:用
var_dump(session_create_id())确认输出是否符合预期字符集和长度
sid_bits_per_character 设置会导致 ID 解析失败——这种问题不会报错,只会静默丢失会话。


















