php 8.4.27 未修复随机数漏洞,仅修复 php2shell(cve-2026-109618/109619);rand()/mt_rand() 仍不安全,应改用 random_int() 或 random_bytes()。

PHP8.4.27 没有“随机数不安全生成漏洞”。这个版本是修复 CVE-2026-109618 和 CVE-2026-109619(PHP2Shell)的紧急安全更新,与随机数生成器(rand、mt_rand、random_int 等)完全无关。
如果你看到“PHP 8.4.27 修复随机数漏洞”的说法,大概率是混淆了以下三件事:
- 把 PHP 官方在 2026 年 10 月 21 日发布的多个修复版本(含
8.4.27)误当成“专修随机数”; - 把 Node.js 同日发布的 CVE-2026-111497(Brotli 越界写入) 或其他语言生态的漏洞张冠李戴;
- 或者把早前某些第三方扩展(如旧版
paragonie/random_compat)的已知问题投射到 PHP 核心。
所以结论很明确:
✅ 升级到 PHP 8.4.27 是为堵住 PHP2Shell 远程代码执行漏洞;
❌ 它不会改变 rand() 的行为,也不修复任何随机数相关缺陷;
⚠️ 如果你真在用 rand() 或 mt_rand() 生成密码、令牌、salt,那问题一直存在——和版本无关,只和用法有关。
rand() 和 mt_rand() 为什么不能用于安全场景
- 它们是普通伪随机数生成器(PRNG),不基于加密学设计,输出可预测;
-
rand()已被弃用(PHP 7.2+ 起触发E_DEPRECATED),mt_rand()虽快但依然不安全; - 即使在
PHP 8.4.27中调用mt_rand(0, 999)生成验证码,攻击者仍可能通过时间侧信道或状态恢复推测后续值。
你应该用:
-
random_int():生成密码学安全整数(推荐,PHP 7.0+ 原生支持); -
random_bytes():生成加密安全字节流,再转成字符串/十六进制/base64; - 不要自己实现“用
microtime()+uniqid()拼接”这类方案——熵源不可控、易被时钟回拨影响。
random_int() 在 PHP 8.4 中的实际用法与坑点
random_int() 底层依赖操作系统 CSPRNG(/dev/urandom 或 CryptGenRandom),PHP 8.4 中行为稳定,但要注意:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 参数范围必须满足
min ,否则抛出 <code>Exception(不是警告); -
max - min不能超过PHP_INT_MAX,否则溢出失败; - Windows 上若系统熵池枯竭(极罕见),可能短暂阻塞,但 PHP 8.4 已优化 fallback 行为;
- 不要把它和
array_rand()混用:后者内部用mt_rand(),即使传入random_int()结果作索引也无意义。
示例(安全生成 6 位数字验证码):
$code = str_pad((string) random_int(0, 999999), 6, '0', STR_PAD_LEFT);
别这么写(错误示范):
$code = sprintf('%06d', mt_rand(0, 999999)); // 不安全,且 PHP 8.4 中 <code>mt_rand()</code> 默认启用 <code>MT_RAND_PHP</code> 模式,兼容性更强但依然不加密安全
为什么有人会误以为“PHP 8.4.27 修了随机数漏洞”
关键混淆点来自两处:
- PHP 8.4 引入了
Random\Engine和Random\Randomizer(PHP 8.3+ 实验性,8.4 正式可用),但这是新 API 层,不是修复旧函数; -
Randomizer默认使用SecureRandomEngine,但它和random_int()是并行关系,不是替代关系;且它不改变rand()/mt_rand()的行为; - 某些文章把 “PHP 8.4 支持更灵活的随机引擎” 错译为 “PHP 8.4 修复了随机数漏洞”,属于技术传播失真。
真正该关注的是:你代码里有没有地方还在用 rand() 生成 token、reset link、API key?如果有,升级到 8.4.27 不会救你——得改代码。
最常被忽略的一点:random_int() 和 random_bytes() 的安全性不依赖 PHP 版本号,而依赖运行环境是否提供可用 CSPRNG。
在容器化部署、Alpine Linux、旧内核(/dev/urandom 可能不可读或返回错误——这时 random_int() 会抛异常,而不是静默降级。
上线前务必在目标环境实测,不要只看本地开发机是否跑通。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










