本文概述
由于将项目的paragonie / random_compat依赖项(或项目的依赖项的依赖项)升级到1.5或主要版本而出现此错误。许多开发人员在使用Laravel和Symfony(symfony / polyfill-php70)时都遇到了这个问题。基本上是问题所在, 如消息中所示, 你的系统上没有更新的PRNG, 你需要提供一个。
伪随机数生成器(PRNG), 也称为确定性随机位生成器(DRBG), 是一种用于生成数字序列的算法, 该数字序列的性质近似于随机数序列的性质。从random_compat库的1.3版开始, 库作者(paragonie)在此警告有关此问题的信息。
完全删除了openssl_random_pseudo_bytes()。如果你在类似Unix的OS上的PHP中使用random_compat, 但无法访问/ dev / urandom, 则1.3+版将引发Exception。如果你想信任OpenSSL, 请随时编写自己的后备代码。 (请参阅解决方案3中的代码段)。
在本文中, 我们将为你的项目中的此错误提供3种可能的解决方案。
解决方案1
尽管你没有直接使用此库, 但是将其作为依赖项添加到composer.json中。需要使用特定版本1.4的random_compat:
{
"require": {
"paragonie/random_compat": "~1.4"
}, }
然后运行composer install(如果已经在使用此库, 则运行composer-update), 然后尝试再次运行项目。如果不起作用, 请尝试降级到1.3, 如果两者都不起作用, 那么我希望你有权修改服务器中的PHP设置并转到下一个可能的解决方案。
解决方案2
如果你能够更改服务器中的PHP设置, 则该解决方案最有可能起作用, 并且可能是你的救星。如前所述, 我们需要在项目中访问urandom, 并且需要使用PHP设置提供它。
你只需要将/ dev / urandom附加到现有的open_basedir配置属性中。
在plesk中, 你可以使用UI轻松完成此任务。
打开plesk, 导航到你的域, 然后打开PHP设置。
转到常规设置, 然后专注于open_basedir选项。
可能在该输入中已经有一个默认值, 你只需要复制该值并将以下字符串附加到现有值即可:
注意
可以通过PHP脚本访问指定目录中的文件。要分隔目录, 请在Linux上使用冒号(:), 在Windows上使用分号(;)。
似乎有很多人的阅读不佳:
对于Linux(基于UNIX)服务器:你需要在dev / urandom扩展名后加上冒号(:), 例如:: / dev / urandom
对于Windows Servers:你需要在dev / urandom后面附加一个分号(;), 例如;; / dev / urandom
#In linux use : (colon)
:/dev/urandom
# In windows use ; (semicolon)
;/dev/urandom
你可以在下图中看到在具有Ubuntu(Unix)的Plesk服务器上该解决方案的示例:
最后保存你的更改, 然后尝试再次进入你的项目。如果你确定正确添加了urandom扩展名, 但该扩展名不起作用, 请继续执行最后一个解决方案。
解决方案3
如果你因为目前为止没有任何可行的解决方案对你有用, 那么让我告诉你你很着急, 因为你没有太多选择。由于前面的步骤都没有对你有用, 因此你只剩下以下选项:
A.降级你的项目
如果你的项目已经在工作, 并且你决定更新框架(Symfony或laravel等), 那么你将需要降级, 因为你将无法提供对urandom的支持(random_bytes函数)。
B.为random_bytes编写自己的后备
如前所述, 该库不再依赖openssl_random_pseudo_bytes函数, 而是使用random_bytes(引发异常的函数)。作者说, 在1.3发行版中, 你可以编写自己的后备代码, 以通过修改库并在使用random_bytes的地方创建一条try和catch语句来再次使用openss_random_pseudo_bytes:
try {
$bytes = random_bytes(32);
} catch (Exception $ex) {
$strong = false;
$bytes = openssl_random_pseudo_bytes(32, $strong);
if (!$strong) {
throw $ex;
}
}
请注意, 在使用PHP <5.3.0的Windows平台上, 该函数openssl_random_pseudo_bytes不可用, 因此你将需要使用CAPICOM ActiveX控件进行另一种解决方法。尽管使用PHP 5.3的人可能永远也不会遇到这种异常(因为所有现代项目都需要更高版本的PHP), 但是如果你使用的是PHP <5.3.0, 则可以查看此代码段以获取更多信息。
玩得开心 !