我可以使用open_basedir访问/ dev/urandom吗?

jen*_*lie 9 php codeigniter phpass

我想在Codeigniter中使用phpass-0.3,但由于以下原因我收到以下错误open_basedir:

遇到PHP错误
严重性:警告
消息:is_readable()[function.is-readable]:open_basedir限制生效.文件(/ dev/urandom)不在允许的路径中:(/ home/phginep:/ usr/lib/php:/ usr/local/lib/php:/ tmp)
文件名:phpass-0.3/PasswordHash. php
行号:51

以下代码:

function get_random_bytes($count)
{
    $output = '';
    if (is_readable('/dev/urandom') &&    //Line Number: 51
        ($fh = @fopen('/dev/urandom', 'rb'))) {
        $output = fread($fh, $count);
        fclose($fh);
    }

    if (strlen($output) < $count) {
        $output = '';
        for ($i = 0; $i < $count; $i += 16) {
            $this->random_state =
                md5(microtime() . $this->random_state);
            $output .=
                pack('H*', md5($this->random_state));
        }
        $output = substr($output, 0, $count);
    }

    return $output;
}
Run Code Online (Sandbox Code Playgroud)

我能做些什么来解决这个问题吗?

Tim*_*ost 16

你有一些选择:

1 - 从真正的RNG下载转储(这个转储基于放射性衰变提供转储)并使用它,只需确保您不会继续读取相同的nn字节.有点笨重,但一个选项.

2 - 让PHP执行/dev/urandom代表它读取的内容(UGLY)

3 - 重新开始mt_rand()(也很难看,但我已经看到了这一点):

 for ($i = 0; $i < $count / 8; $i++) {
   $output .= dechex(mt_rand(0, 0x7fffffff));
 }
Run Code Online (Sandbox Code Playgroud)

不幸的是,所有选项都很笨拙和丑陋.最好的办法是确保你不必处理open_basedir.尽管如此,这种特殊的烦恼还是可以解决的.

最后 - 不太可能与你的主人一起飞行,但也许值得一试:

您可以要求您的主机urandom在您的主目录中提供,以便您可以阅读它.告诉他们你需要访问urandom来生成随机数,这样你就可以为用户提供更好的安全性,然后让他们运行:

mknod urandom c 1 9
Run Code Online (Sandbox Code Playgroud)

在您的主目录中.我只是在自己的服务器上试过它,它可以工作(但root需要为你做).有没有实际的理由,让你使用系统的伪随机数发生器,它您可以与比PHP以外的任何其他方式做.这实际上是让他们有权访问的最简单方法,urandom因为它不需要PHP或vhost配置中的例外.

禁止访问/dev/random是一件合理的事情,因为/dev/random必须通过可用的(新的)系统熵补充,并且可能导致重要的事情在读取时被阻止,如果耗尽,这可能经常发生在低流量服务器上.但是,/dev/urandom保证永远不会阻塞,因为它只是重新使用内部熵池,这就是为什么它是一个质量较差的源.

注意

我不是说的想法open_basedir是一个坏的,但它打破太代码.经典chroot更好,但更难,这就是为什么你遇到的open_basedir不仅仅是你真正的chroot.至少,任何程序应该能够访问null,zerourandom在服务器上的设备.


SuN*_*SuN 6

phpass正在尝试访问/dev/urandom,这是不允许的.php.ini 要解决此问题,您必须禁止警告.要这样做,只需添加@之前is_readable,像这样:

...
@is_readable('/dev/urandom')
...
Run Code Online (Sandbox Code Playgroud)

  • 实际上你隐藏的问题不仅仅是解决问题. (4认同)

Joh*_*nde 0

看起来您使用的是共享主机,并且他们已将 PHP 配置为仅允许您访问帐户内的文件和目录(这是有道理的)。如果是这种情况,您无能为力,因为共享托管不允许进行更改以允许您访问该资源。如果您有专用服务器或 VPS,您可以更改 PHP 配置 (php.ini) 以允许访问该资源。