Как защитить загружаемые файлы в удаленном каталоге от не премиум-пользователей (в php?) - PullRequest
1 голос
/ 11 октября 2009

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

Ответы [ 4 ]

3 голосов
/ 11 октября 2009

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

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

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

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

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

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

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

MIME типы

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

2 голосов
/ 11 октября 2009

Как сказал @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();

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

0 голосов
/ 11 октября 2009

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

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

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

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

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

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

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

0 голосов
/ 11 октября 2009

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

...