Как обслуживать документы вне корня сети, используя PHP? - PullRequest
8 голосов
/ 09 октября 2011

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

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

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

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

(К вашему сведению, я использую Linux, Apache и PHP на общем хосте)

Ответы [ 2 ]

9 голосов
/ 09 октября 2011

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

<?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);
1 голос
/ 09 октября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...