2009-10-11 5 views
0

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

ответ

3

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

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

проходят по параметрам через куки, получить, после, сессии, или в зависимости от того каким образом вы проверяете привилегии.

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

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

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

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

MIME types

PHP Header Function

+3

С помощью этого решения позаботьтесь о том, чтобы защитить загрузку файла, введя URL-адрес непосредственно в адресной строке. Например, либо помещайте защищенные файлы в каталог, расположенный за пределами корня веб-сайта, либо обращайтесь к директивам httpd.conf. – xanadont

+0

, и если это все равно на другом сервере, вы можете создать файл или загрузить файл для загрузки по-разному. просто помните, что вы не сможете защищаться от самых решительных загрузчиков. – pxl

0

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

2

Как @pxl сказал, что вам нужно проверить для авторизации, а затем вывод правильного типа пантомимы как заголовок 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

yup, и вы можете получить этот файл из любого места, к которому имеет доступ веб-сервер. – pxl

0

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

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

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

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

  4. Сервер перенаправляет пользователя на сервер B, подающий TicketID как GET параметр

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^