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设备.