我想在Codeigniter中使用phpass-0.3,但由于open_basedir
我收到以下错误:
遇到PHP错误
严重性:警告
消息:is_readable()[function.is-readable]:open_basedir 限制有效。文件(/ dev / urandom)不在允许范围内 path(s):( / 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;
}
我能做些什么来解决这个问题吗?
答案 0 :(得分:16)
你有一些选择:
1 - 从真正的RNG下载转储(this one提供基于放射性衰变的转储)并使用它,只需确保不继续读取相同的nn字节。有点笨重但是一种选择。
2 - 让PHP执行代表/dev/urandom
读取的内容(UGLY)
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要多得多。至少,任何程序都应该能够访问服务器上的null
,zero
和urandom
设备。
答案 1 :(得分:6)
phpass正在尝试访问/dev/urandom
php.ini
要解决此问题,您必须取消警告。为此,只需在@
之前添加is_readable
,如下所示:
...
@is_readable('/dev/urandom')
...
答案 2 :(得分:0)
看起来你在共享主机托管上,他们已经配置PHP只允许你访问帐户中的文件和目录(这是有道理的)。如果是这种情况,您可以做的事情不多,因为共享主机不允许更改以允许您访问该资源。如果您有专用服务器或VPS,则可以更改PHP配置(php.ini)以允许访问该资源。
答案 3 :(得分:0)
cd /nginx/chroot/
touch random
touch urandom
mount --bind /dev/random /nginx/chroot/dev/random
mount --bind /dev/urandom /nginx/chroot/dev/urandom
我的phpmailer现在正在使用nginx chroot centos 7
php nginx RAND_BYTES stream_socket_enable_crypto php nginx stream_socket_enable_crypto 未捕获的例外:无法打开源设备 php nginx RAND_BYTES stream_socket_enable_crypto stream_socket_enable_crypto():SSL