php – 我可以访问/ dev / urandom与open_basedir有效吗?
我想在Codeigniter中使用phpass-0.3,但是由于open_basedir,我收到以下错误:
以下代码: 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设备. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |