Есть ли альтернатива php readfile() в безопасном режиме сервера?

#php #readfile #safe-mode #php-safe-mode

#php #readfile #безопасный режим #php-safe-mode

Вопрос:

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

Спасибо

Комментарии:

1. Не работает, я уже пробовал это, но я получаю пустой экран Word для файлов .docx или просто ошибку для файлов pdf и т.д.

2. Какое сообщение об ошибке вы получаете? Учитывая, что это safe_mode устарело , вы можете захотеть переключить хосты, если они включили его совсем недавно. В любом случае, отправьте своему хостеру электронное письмо с просьбой расслабиться safe_mode .

3. Это не поможет, поскольку они утверждают, что это уменьшает количество взломов серверов, и это общий хостинг, поэтому я мало что могу сделать, чтобы убедить их — это их новая политика, я могу просто сменить хосты, если захочу, но у меня там около 20 сайтов клиентов, и начать перемещать их все сейчас будет головной болью. Интересно, есть ли обходной путь для обработки загрузки файла, об этом чертовом хостинге я подумаю позже, что делать..

4. В этом случае, readfile() на самом деле не зависит от безопасного режима. В документах говорится, что файл и каталог должны принадлежать одному и тому же пользователю, который выполняет скрипт, это то, что проверяется в безопасном режиме . В этом случае readfile() полностью отключен, что скорее делается disable_functions .

5. @Maor, хотя это и не решает проблему, это может направить вас в правильном направлении. Знание причины проблемы является частью решения.

Ответ №1:

Как я писал в комментариях, readfile() отключается путем включения его в директиву disable_functions php.ini. Это не имеет ничего общего с безопасным режимом. Попробуйте проверить, какие функции отключены, и посмотрите, можете ли вы использовать любую другую функцию (-ы) файловой системы для выполнения того, что readfile() делает.

Чтобы просмотреть список отключенных функций, используйте:

 var_dump(ini_get('disable_functions'));
  

Вы могли бы использовать:

 // for any file
$file = fopen($filename, 'rb');
if ( $file !== false ) {
    fpassthru($file);
    fclose($file);
}

// for any file, if fpassthru() is disabled
$file = fopen($filename, 'rb');
if ( $file !== false ) {
    while ( !feof($file) ) {
        echo fread($file, 4096);
    }
    fclose($file);
}

// for small files;
// this should not be used for large files, as it loads whole file into memory
$data = file_get_contents($filename);
if ( $data !== false ) {
    echo $data;
}

// if and only if everything else fails, there is a *very dirty* alternative;
// this is *dirty* mainly because it "explodes" data into "lines" as if it was
// textual data
$data = file($filename);
if ( $data !== false ) {
    echo implode('', $data);
}
  

Комментарии:

1. Это отключенные функции — «readfile, system, shell_exec, proc_terminate, proc_nice, proc_open, pclose, popen, passthru, pcntl_fork, pcntl_exec, posix_kill, pcntl_signal, ini_restore, posix_getpwuid, escapeshellarg, escapeshellcmd. Я собираюсь попробовать ваши предложения выше

2. ты король! fpassthru, похоже, работает просто отлично. Большое, большое спасибо. Я хотел также проголосовать за это, но я не могу, пока у меня не будет еще 2 баллов репутации (новый пользователь здесь ..)

Ответ №2:

Я предполагаю, что вы используете readfile для загрузки удаленных файлов, как вы сказали «с сервера». Если это правильно, ваша проблема не в безопасном режиме, а в том, что открытие URL-адресов с помощью обычных функций php-файла больше не разрешено (настройка allow_url_fopen отключена).

В этом случае вы можете использовать функции curl PHP для загрузки файлов. Кроме того, file_get_contents является допустимой альтернативой.

Комментарии:

1. Ну, это небольшой плагин, который я использую, который использует функцию readfile () для загрузки файла с сайта (сервера) на компьютер пользователя. Все работало нормально, пока недавно хостинговая компания не включила safe_mode. Это сообщение об ошибке, которое я получаю — Предупреждение>: readfile () был отключен по соображениям безопасности в /home/full/path/to/my/script.php в строке 146