Вопрос по php, pdf – Создание защищенного файлового хостинга для PDF-файлов

8

Я работаю над созданием веб-сайта, который позволяет клиентам входить в систему и видеть различныеPDFs сохранено на сервере. Эти PDF-файлы будут уникальными для клиента и не должны быть доступны для тех, кто не вошел в систему. Получение файлов на сервер не должно быть проблемой, я просто не уверен, как обслуживать их для конечных пользователей.

Я реализовал такую вещь с данными изSQL servers меня обслуживают вместо файлов, поэтому я не совсем уверен, какой самый эффективный способ это сделать.

Сайт находится наLAMP и мой минимальный опыт вPHP (но если структура или другой язык облегчили бы это, я могу изучить это).

Я, наверное, в голове, но обычно так и есть, поэтому любой вклад был бы отличным.

Ваш Ответ

3   ответа
2

Джон опубликовал основной правильный способ сделать это, поэтому я добавляю (вероятно, низшую) альтернативу: подавать ее из базы данных. Просто создайте столбец BLOB для PDF и прочитайте / сохраните данные файла из базы данных. У вас получится довольно большой стол, но он будет работать. Обслуживание это требует установки того же самогоheader()Как писал Джон, вы просто отправляете данные из БД, а не из файла.

Это имеет то преимущество, что вам не нужно гарантировать, что у вас нет конфликтов имен файлов и т. Д.

9

Поместите файлы вне webroot. Затем с помощью PHP передайте файл через скрипт. Таким образом, никто не сможет напрямую связаться с файлом и обойти ваши элементы управления. (Естественно, убедитесь, что скрипт, который делает это, только после проверки, что у пользователя есть разрешение на получение этого файла).

Пример PHP:

<?php
    session_start();
    if (!isset($_SESSION['authenticated'])) {
        exit;
    }
    $file = '/path/to/file/outside/www/secret.pdf';

    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
?>
& APOS не должен; тsession_start(); быть загруженным? Я полагаю, что он должен работать с сессиями.
Просто проверяю ;-)
На самом деле, да, так и должно быть. Я был так сосредоточен на основной концепции, что не представил действительно полный пример. Собираюсь исправить это сейчас ...
4

Самый простой способ - дать этим файлам длинные случайные имена файлов (скажем, 20 случайных символов). Технически они будут доступны любому, но угадать URL будет невозможно, поэтому доступ имеют только авторизованные пользователи.

В качестве альтернативы Джон Конде уже обрисовал способ подачи файла из сценария PHP. Это приведет к небольшому снижению производительности, но будет таким же безопасным, как и ваш код. Единственное, что я могу добавить, это то, что если вы не можете разместить их вне webroot, вы можете использовать .htaccess, чтобы запретить людям доступ к файлам напрямую.

@ zebediah49 - это возможно, ноthere are pitfalls что вы должны знать. Просто генерировать случайную строку безопаснее. И, если вы хотите быть на 110% уверенным, используйте криптографически сильный генератор случайных чисел.
GUID имеет 32 символа, но только 16 возможностей для каждого символа. 20 случайных символов из a-z9-9 имеют 36 возможностей для каждой позиции.
Очень интересно, спасибо. Я выбрал GUID для длины, но я все равно избегал бы использования общедоступных URL, но это очень хороший момент.
Я бы предложил GUID. По-прежнему существует проблема, заключающаяся в том, что я могу пропинговать сервер, пока не получу что-то интересное, хотя вы можете сделать шансы на успех невероятно маленькими. Я поддерживаю использование .htaccess, чтобы заблокировать доступ к папке.

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