php – 我可以访问/ dev / urandom与open_basedir有效吗?

前端之家收集整理的这篇文章主要介绍了php – 我可以访问/ dev / urandom与open_basedir有效吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想在Codeigniter中使用PHPass-0.3,但是由于open_basedir,我收到以下错误

A PHP Error was encountered
Severity: Warning
Message: is_readable() [function.is-readable]: open_basedir
restriction in effect. File(/dev/urandom) is not within the allowed
path(s): (/home/phginep:/usr/lib/PHP:/usr/local/lib/PHP:/tmp)
Filename: PHPass-0.3/PasswordHash.PHP
Line Number: 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,$count);
    }

    return $output;
}

有什么可以做的来解决这个问题吗?

你有一些选择:

1 – 从一个真正的RNG下载一个转储(this one提供基于放射性衰变的转储),并使用它,只要确保你不读取相同的nn个字节.种种笨重,但是一个选择.

2 – PHP代码(UGLY)执行从/ dev / urandom读取的内容

3 – 回到mt_rand()(也丑,但我已经看到这样做):

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

所有的选择都是笨重和丑陋的,不幸的是.最好的做法是确保你不必处理open_basedir.不过,这个特别的烦恼可以解决.

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

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

mknod urandom c 1 9

在你的主目录我只是在自己的服务器上尝试,它的工作原理(但root需要为您做).没有实际的理由阻止你使用系统的伪随机生成器,除了PHP之外你可以使用它.这实际上是他们允许您访问urandom的最简单的方式,因为它不需要PHP或vhost配置中的异常.

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

注意

我不是说open_basedir的想法是坏的,但它也打破了良好的代码.经典的chroot更好,但更难,这就是为什么你遇到open_basedir比你做一个真正的chroot更多.至少,任何程序都应该能够访问服务器上的零,零和urandom设备.

原文链接:https://www.f2er.com/php/131838.html

猜你在找的PHP相关文章