Я хочу использовать 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), чтобы разрешить доступ к этому ресурсу.