Я пытаюсь настроить PHP-скрипт, который может извлекать файлы (для проверенных пользователей) из папки за пределами живого веб-корня.Проблема в том, что при этом, даже если я использую правильный заголовок «Content-Type», файл загружается как application/octet-stream
.Это имеет последствия для безопасности, если пользователь позже попытается повторно загрузить загруженный файл, так как он будет обнаружен как приложение, даже если это действительно PDF-файл (мое приложение позволяет загружать только определенные типы MIME).
Это то, что я использую для загрузки файла в браузер:
$secret_file = "../attach/1/test.pdf";
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false);
header("Content-Type: ".mime_content_type($secret_file));
header("Content-Disposition: inline; filename=\"test.pdf\";");
header("Content-Transfer-Encoding: binary");
readfile($secret_file);
Интересно, что если я загружаю файл таким образом через браузер и просматриваю его свойства в linux, он отображается как «application /PDF».Однако, если я проверяю тот же файл с помощью функции PHP mime_content_type()
, он читается как application/octet-stream
.
. Я подтвердил, что проверка исходного файла таким образом (до того, как он был извлечен через readfile
) показывает егоas application/pdf
.
Есть ли способ использовать readfile()
без изменения типов пантомимы?Или, возможно, есть лучшая альтернатива?
РЕДАКТИРОВАТЬ
Отвечая на несколько вопросов из комментариев:
- Инструменты разработчика в Firefox сообщают, чтовстроенный файл имеет заголовок
Content-Type: application/pdf
. - sha256sum загруженного файла не соответствует исходному файлу.Но как можно использовать
readfile()
(или аналогичный) без изменения файла?