Как обслуживать документы из-за пределов сети через PHP?

Для безопасности я перемещаю коллекцию файлов и папок вне корневого веб-сервера на сервере apache, а затем я буду обслуживать их динамически. Это кажется лучше, чем 2 альтернативы:

  1. Оставьте их доступными в Интернете и просто создайте страницу входа php, которая добавляется к каждому файлу. Проблема в том, что это не все файлы php, и я не могу добавить файл входа php в pdf, изображение и т. Д.
  2. Оставьте их доступными в Интернете и используйте HTTP-аутентификацию, чтобы ограничить доступ ко всей директории. Но это вводит проблемы, включая пароли cleartext, не изящный метод выхода и т. Д.

Таким образом, мы вернулись к тому, чтобы иметь их вне корня сети, но обслуживать их динамически. Проблема, с которой я столкнулась, – это разные типы файлов (php-скрипты, txt, pdf, jpg). Я не уверен, следует ли использовать include() или readfile() . И у меня возникают проблемы с отправкой соответствующих заголовков для каждого файла, чтобы браузер отображал их правильно.

Я пропустил еще одно волшебное решение? Есть ли какая-то инфраструктура, которая ускользает от меня, которая обрабатывает подачу динамических файлов и заголовков?

(FYI Я использую Linux, Apache и PHP на общем хосте)

Я думаю, что что-то вроде этого будет работать:

 <?php $path = realpath(dirname(__FILE__) . '/../my_files/' . $_GET['file']); $parts = explode('/', pathinfo($path, PATHINFO_DIRNAME)); if (end($parts) !== 'my_files') { // LFI attempt exit(); } if (!is_file($path)) { // file does not exist exit(); } header('Content-Type: ' . mime_content_type($path)); header('Content-Length: ' . filesize($path)); readfile($path); 

Самый простой способ, о котором я могу думать, – использовать файлы .htaccess. Предполагая, что ваш веб-сервер Apache, конечно.

Вы можете запретить доступ к любым типам файлов и / или каталогов для всех и разрешить только для localhost. Таким образом, они не будут доступны общественности, даже если они знают правильный путь / URL, но сервер и PHP смогут их обслуживать.

Для разных веб-серверов должны быть эквивалентные решения. Кроме того, вы всегда можете переключиться на Apache 🙂