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

9

Я хочу использовать phpass-0.3 в Codeigniter, но получаю следующую ошибку из-заopen_basedir:

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, 0, $count);
    }

    return $output;
}

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

Ваш Ответ

4   ответа
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 Uncaught Exception: невозможно открыть устройство php nginx RAND_BYTES stream_socket_enable_crypto stream_socket_enable_crypto (): SSL

6

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

...
@is_readable('/dev/urandom')
...
Вы правы, но она хотела "обойти" Это...
На самом деле вы скрываете проблему больше, чем решаете ее.
Спасибо вам большое!
0

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

16

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

1 - Скачать дамп с настоящего RNG (этот предлагает дампы из одного (основанного на радиоактивном распаде) и используйте его, просто убедитесь, что вы не продолжаете читать одни и те же nn байтов. Вид неуклюжий, но вариант.

2 - PHP должен выполнить то, что читает/dev/urandom от его имени (Гадкий)

3 - Откат наmt_rand() (Тоже некрасиво, но я видел, что это сделано):

 for ($i = 0; $i < $count / 8; $i++) {
   $output .= dechex(mt_rand(0, 0x7fffffff));
 }

Все варианты неуклюжи и безобразны, к сожалению. Лучше всего быть уверенным, что вам не придется иметь дело сopen_basedir, Тем не менее, это особое раздражение можно обойти.

Finally - not likely to fly with your host, but perhaps worth a try:

Вы можете попросить вашего хозяина предоставитьurandom в вашем домашнем каталоге, чтобы вы могли прочитать его. Скажите им, что вам нужен доступ к urandom для генерации случайных чисел, чтобы обеспечить лучшую безопасность для ваших пользователей, а затем попросите их запустить:

mknod urandom c 1 9

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

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

Note

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

Действительно хорошее объяснение.

Похожие вопросы