Как я могу загрузить загружаемый файл онлайн, не раскрывая физический путь? - PullRequest
7 голосов
/ 15 мая 2009

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

myurl.com/docs/mypdf.pdf

Таким образом, физический путь к документу открыт для всех, кто вошел в систему. Как лучше хранить физический путь к документу скрытым, чтобы зарегистрированные пользователи не могли делиться прямыми ссылками с незарегистрированными пользователями или публиковать прямые ссылки на документы в другом месте?

РЕДАКТИРОВАТЬ: Я просто искал идею, которая не зависит от языка, поэтому я выбрал несколько своих любимых языков для тегов. Фактическая реализация в этом случае - классика ASP. В настоящее время я использую скрипт-обертку загрузки, который подтверждает, что пользователь вошел в систему, прежде чем перенаправить на реальный URL документа. Я просто не включил это в свой вопрос для простоты.

Ответы [ 8 ]

11 голосов
/ 15 мая 2009

Не делай этого. Вместо этого держите файлы где-нибудь за пределами дерева документов, а затем делайте их доступными с помощью скрипта (например, php, .Net, что угодно)

Сценарий может проверить, вошли ли они в систему, проверить, разрешен ли файл, и, если да, вернуть его. Путь, по которому они идут, может выглядеть примерно так ... /download.php?file=mypdf.pdf

Что-то вроде ...

<?php
if (IsUserLoggedIn())
    readfile('/secret/path/to/file/mypdf.pdf');
?>
8 голосов
/ 15 мая 2009

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

Это, кажется, показало хороший пример в php, который вы, похоже, использовали? Просто добавьте проверку безопасности в начало php и вышвырните их, если они не авторизованы.

http://www.higherpass.com/php/Tutorials/File-Download-Security/

1 голос
/ 18 мая 2009

У меня была похожая проблема много лун назад в классическом ASP.

Хранит файлы в каталоге вне webroot.

После проверки отправил файл через ADODB.Stream, а затем проверил расширение файла, чтобы убедиться, что у меня установлен правильный тип mime.

1 голос
/ 15 мая 2009

Что вы хотите сделать, это создать страницу PHP, которая делает две вещи:

  1. аутентификация пользователя, который делает запрос
  2. потоковая передача файла клиенту

Эта ссылка поможет с потоками. И этот код может быть полезен:

header("Content-Disposition: attachment; filename=$name of pdf that you want to download");
header("Content-Type: application/pdf");
header("Content-Length: ".filesize("$location of pdf/$name of pdf that you want to download"));
header("Pragma: no-cache");
header("Expires: 0");
$fp=fopen("$location of pdf/$name of pdf that you want to download","r");
print fread($fp,filesize("$location of pdf/$name of pdf that you want to download"));
fclose($fp);
exit();

Увидел это в обсуждении здесь .

1 голос
/ 15 мая 2009

лучший способ сделать это - использовать php / asp или файл сценариев на стороне сервера, который читает документ в месте, недоступном извне

этот файл затем может проверить, вошел ли пользователь в систему, а также может скрыть путь к физическому файлу

поэтому URL будет www.yourwebsite.com/file.php?file=image.png

file.php будет проверять, что пользователь вошел в систему тогда он прочитает файл или перенаправит их на страницу входа

0 голосов
/ 15 мая 2009
  1. Использовать скрипт для контроля доступа

    Создайте скрипт вроде myurl.com/file.php?docs/mypdf.pdf, который проверяет, есть ли у пользователя права на доступ к файлу. Сценарий извлечет файл из места, которое не видно в Интернете.

  2. (Необязательно) Используйте mod_rewrite, чтобы ваши URL выглядели хорошо, и перенаправьте пользователя в скрипт file.php. Что-то вроде:

    RewriteCond docs /% {REQUEST_FILENAME}! -F

    RewriteRule ^ (. *) $ File.php / $ 1 [QSA, L]

    Это перенаправит /docs/mypdf.pdf в /file.php?docs/mypdf.pdf, но будет выглядеть лучше для пользователя.

0 голосов
/ 15 мая 2009

Вы можете использовать IHttpHandler в .net, хотя вам нужен доступ с подстановочным знаком в IIS. Вы можете использовать обработчик на основе сеанса.

0 голосов
/ 15 мая 2009

Непонятно, используете ли вы ASP.NET, ASP.NET MVC или что-то еще. Тем не менее, этот пост ...

Как представить файл для загрузки с контроллера MVC?

... показывает, как программно вернуть файл пользователю с помощью ASP.NET (вопрос показывает путь ASP.NET, ответы показывают путь MVC).

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

Если вы находитесь на этапе разработки, когда еще не поздно использовать ASP.NET MVC, сделайте это. Этот сценарий (подача файла) становится однострочным, и многие другие вещи будут проще (в частности, тестирование вашего приложения).

...