2016-08-10 2 views
0

Я создаю репозиторий файлов с помощью веб-интерфейса. Пользователи смогут войти в систему (простую систему авторизации PHP) и просмотреть свои файлы, хранящиеся на сервере. Каждый каталог имеет имя, которое определяет, к какому пользователю он принадлежит.PHP - защита локального файла repo

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

Как мне подойти к этой проблеме? Хранение их в базе данных, поскольку BLOB-это плохая идея, потому что каждый файл имеет более 1.5G. Тот факт, что это видеофайлы, которые будут воспроизводиться с помощью плагина javascript, также важен - им необходимо напрямую обращаться к браузеру пользователя.

UPDATE

Для тех, кто борется с той же проблемой: я сделал, как Sherif предложил в своем ответе. Вам нужно установить mod_xsendfile и добавить

XSendFile On 
XSendFilePath "/var/www/" 

в файл конфигурации Apache в разделе <Directory>. Конечно, измените путь в соответствии с вашими потребностями. Затем создайте файл PHP, который будет обрабатывать запросы. Вот пример PHP-как псевдо-код:

$file = $_GET["file"]; 
if (user_logged_in() && user_allowed_to_download($file)){ 
    $absoluteFilePath = "/var/www/".$file; 
    header("X-Sendfile: ".$absoluteFilePath); 
    header("Content-type: application/octet-stream"); 
    header("Content-Disposition: attachment; filename=".$file); 
} 

Затем вы можете использовать его с jwplayer, VLC и т.д., как так:

<div class="embed_vlc_wrapper"> 
    <embed type="application/x-vlc-plugin" pluginspage="http://www.videolan.org" version="VideoLAN.VLCPlugin.2" 
     width="500" 
     height="500" 
     version="VideoLAN.VLCPlugin.2" 
     target="http://localhost/xsend.php?file=1.mp4" 
     pluginspage="http://www.videolan.org" 
    /> 
</div> 
+0

Вы можете хранить файлы в любом месте, и сохранить имена файлов в базе данных. –

+0

@AlexBlex Я знаю, но пользователям необходимо получить к ним доступ напрямую, чтобы просмотреть их содержимое. Недостаточно имени файла. Конечно, я мог бы написать сценарий, который будет временно скопировать каждый файл в корень документа по запросу, а затем (после его загрузки пользователем) удалите его. Но это ужасная идея. –

+0

Если «доступ к ним напрямую» означает «скачать», вы можете использовать [readfile] (http://php.net/manual/en/function.readfile.php). –

ответ

1

Если вы хотите, чтобы пользователь пройти через PHP для проверки подлинности и доступ к файлу за пределами корня документа, это нормально. Просто выполните обычную проверку подлинности, а затем вы можете использовать заголовок , чтобы ваш веб-сервер обслуживал файл из любого места в вашей файловой системе. См. Документацию для вашего веб-сервера о том, как включить sendfile: например. Apache httpd, Nginx

Так вот основная идея ...

if (isset($_SESSION['user_authenticated'])) { // or however you verify the user 
    header('X-Sendfile: ', $pathToFileForDownload); // your web server will do the rest 
} 
+0

Я не уверен, могу ли я использовать X-Sendfile с jwplayer или другими плагинами видео javascript. Проверьте последнее предложение в моем обновленном вопросе. Извините, что не включал эту информацию раньше. –

+0

Это ничего не меняет. Если запрос выполняется через http на ваш веб-сервер, результат будет таким же. PHP обрабатывает проверку того, имеет ли человек права доступа к запрашиваемому файлу, а ваш веб-сервер обрабатывает файл. – Sherif