个性化阅读
专注于IT技术分析

如何解决PHP 7.0 Polyfill:There is no suitable CSPRNG installed on your system – paragonie/random_compat

点击下载

本文概述

由于将项目的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设置。

PHP设置Plesk

转到常规设置, 然后专注于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服务器上该解决方案的示例:

Plesk管理器open_basedir路径

最后保存你的更改, 然后尝试再次进入你的项目。如果你确定正确添加了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:

<?php
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, 则可以查看此代码段以获取更多信息。

玩得开心 !

赞(0)
未经允许不得转载:srcmini » 如何解决PHP 7.0 Polyfill:There is no suitable CSPRNG installed on your system – paragonie/random_compat

评论 抢沙发

评论前必须登录!