Могу ли я получить доступ к / dev / urandom с помощью open_basedir?

Я хочу использовать phpass-0.3 в Codeigniter, но я получаю следующую ошибку из-за 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; } 

Есть ли что-нибудь, что я могу сделать, чтобы обойти это?

У вас есть несколько вариантов:

1 – Загрузите дамп из реального RNG ( этот предлагает дампы от одного на основе радиоактивного распада) и используйте это, просто убедитесь, что вы не читаете одни и те же 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 

В вашем домашнем каталоге. Я просто попробовал это на своем собственном сервере, он работает (но для этого нужен корень). Нет никакой практической причины, чтобы держать вас от использования генератора псевдослучайных чисел системы, что вы могли бы сделать иначе с чем-либо, кроме PHP. На самом деле это самый простой способ предоставить вам доступ к urandom потому что он не требует никаких исключений в настройках PHP или vhost для вас.

Отказ от доступа к /dev/random – это разумная вещь, поскольку /dev/random необходимо пополнять доступной (новой) системной энтропией и может привести к тому, что важные вещи блокируются при чтении, если они исчерпаны, что может часто возникать на серверах с низким трафиком. Тем не менее, /dev/urandom гарантированно никогда не блокируется, так как он просто повторно использует внутренний энтропийный пул, который был исчерпан, поэтому он является менее качественным источником.

Заметка

Я не говорю, что идея open_basedir – плохая, но она тоже ломает хороший код. Классический chroot намного лучше, но сложнее, поэтому вы сталкиваетесь с open_basedir гораздо больше, чем с настоящим chroot. Как минимум, любая программа должна иметь возможность доступа к null , zero и urandom устройствам на сервере.

phpass пытается получить доступ к /dev/urandom , который не разрешен в вашем php.ini Чтобы решить эту проблему, вы должны пресечь предупреждение. Для этого просто добавьте @ before is_readable , например:

 ... @is_readable('/dev/urandom') ... 

Похоже, вы находитесь на общедоступном хостинговом хостинге, и они настроили PHP только для доступа к файлам и каталогам в вашей учетной записи (что имеет смысл). Если это так, вы не можете сделать так, как разделяемый хостинг не позволит изменять доступ к этому ресурсу. Если у вас есть выделенный сервер или VPS, вы можете изменить свою конфигурацию PHP (php.ini), чтобы разрешить доступ к этому ресурсу.