PHP的openssl_random_pseudo_bytes函数在什么场景下会返回false?
关于
openssl_random_pseudo_bytes返回false的场景及触发方法 你之前禁用openssl扩展得到函数未找到的报错属于正常情况,返回false的前提是函数可正常调用,也就是openssl扩展处于启用状态。常见的触发返回false的场景如下:
触发失败返回false的场景
- 参数不合法:当传入的长度参数为负数,或者长度值超过当前进程可分配的内存上限时,函数会直接返回false。
- 系统随机源不可用:函数依赖操作系统提供的密码学安全随机数接口,Unix/Linux下依赖
/dev/urandom、Windows下依赖系统随机数API,如果这些接口不存在、无读取权限,或者运行在没有挂载随机源的chroot、极度裁剪的嵌入式环境中,就会返回false。 - OpenSSL库状态异常:如果PHP链接的OpenSSL库初始化失败、随机数种子未正确生成,运行时随机数生成器处于未就绪状态,也会返回false。
注:PHP 7.0及以上版本对该函数做了底层随机源兜底,常规运行环境下返回false的概率极低,仅非法参数或者极端裁剪的特殊环境才会触发。
手动触发测试的方法
不需要修改扩展配置,就能轻松触发返回false的场景:
- 最简单的方案是传入负长度参数,执行测试代码:
运行后直接会输出var_dump(openssl_random_pseudo_bytes(-1));bool(false)。 - 也可以通过模拟无随机源的环境测试:创建一个空目录作为chroot根目录,仅拷贝PHP运行必要的二进制文件和依赖库,不挂载
/dev/urandom,在该chroot环境中执行函数即可触发返回false。
内容的提问来源于stack exchange,提问作者CJ Dennis
相关产品推荐
相关产品推荐

