Как защитить загружаемые файлы в удаленном каталоге от не-премиум-пользователей (в php?)

Я создаю раздел «премиум» на своем сайте, а Im должен предоставлять доступ к файлам непосредственно на удаленном компьютере (на другом сервере), для пользователей со специальными привилегиями (учетные записи, хранящиеся в mysql db). Мой сайт закодирован в php / mysql, поэтому php-решение будет отличным.

направьте все ссылки на скачивание в php-файл, который будет выполнять все проверки учетных данных.

вы можете вызвать файл download.php

передавать параметры через файлы cookie, получать, отправлять сообщения, сеансы или независимо от того, каким образом вы проверяете привилегии.

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

если это изображение, заголовок будет header("Content-type: image/jpeg");

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

некоторые полезные ссылки:

Типы MIME

Функция заголовка PHP

Как сказал @pxl, вам нужно проверить авторизацию, а затем вывести правильный тип mime в качестве заголовка HTML (например, он сказал: header("Content-type: image/jpeg"); )

Кроме того, как только вы закончите с этим, вам нужно будет вывести фактическое содержимое файла и его размер (в байтах) как таковой:

 header("Content-Length: ".filesize("FILENAME")*1.001); /* The *1.001 puts a nice buffer on the filesize, I read about it online. Browsers will stop downloading exactly at the Content-Length, but if they go over, it's not a big deal at all. */ readfile("FILENAME"); die(); 

Просто не забудьте сохранить файл в каталоге, который недоступен из Интернета.

Я привык делать это в ASP.NET, где он встроен, но эта статья, похоже, фиксирует вашу точную ситуацию.

Вот что я сделал бы:

  1. Построен PHP-SOAP-Sever на удаленном сервере B, который содержит файлы.

  2. Всякий раз, когда пользователь запускает загрузку на вашем основном сервере, подключитесь к SOAP-серверу на B и зарезервируйте билет для пользователя, указав IP-адрес и идентификатор / путь к файлу для загрузки.

  3. Сервер B теперь будет создавать ticketId (который должен быть действителен только в течение ограниченного времени) для этой загрузки и вернуть его в A.

  4. Сервер A перенаправляет пользователя на сервер B, поставляя ticketId в качестве параметра GET

  5. Сервер B теперь проверяет, был ли уже использован билет, истек или пользователь пришел с неправильного IP. Если ни один из них не применяется, подайте файл и отметьте используемый билет.

Примечание. На сервере B не следует работать с PHP во время работы с файлом, но вместо этого используйте заголовок X-Sendfile . В противном случае загрузка может прекратиться после выполнения PHP max.