Надежно хранить загружаемые файлы - PullRequest
0 голосов
/ 23 июня 2011

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

Пользователи будут покупать файл с веб-сайта, а затем иметь доступ к загружаемому файлу столько времени, сколько потребуется.

Это вопрос из двух частей:

  1. Как я могу убедиться, что платные файлы не загружены неавторизованными людьми? И
  2. Как мне обращаться с аутентификацией для проверки, может ли пользователь загрузить платный файл?

По первому вопросу, я предполагаю, что я храню файлы в хешированном имени каталога, так что предположение будет почти невозможно? Будет ли сервер S3 хорошим решением здесь? Какие проблемы мне нужно знать в этом отношении?

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

purchases table
   -> id
   -> hash (unique purchase identifier)
   -> user (foreign key)
   -> file (foreign key)
   -> ...other stuff here like timestamp, etc...

... и затем с помощью приложения убедитесь, что пользователь совершил покупку, поэтому URL для загрузки будет:

http://www.example.com/something/download/sd9f7u23ihosd8087603/

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

Это хороший путь? Есть ли лучшее решение? Я уверен, что мне здесь не хватает деталей ...


Заявка написана на Django, если это имеет какое-либо отношение к проблеме. Еще одно замечание: на сайте будут доступны как бесплатные, так и платные загрузки.

Примечание: этот вопрос похож на тот, что я задаю: Наличие в Django загружаемых файлов

1 Ответ

0 голосов
/ 24 июня 2011

Что, если ...

1) Сохраните файлы в каталоге, к которому Apache не имеет прямого доступа.

2) В представлении «Купить файл» создайте пользовательский файл.символьная ссылка (с использованием ваших хэшей), которая указывает на фактический файл и перенаправляет, чтобы позволить Apache обработать файл через символическую ссылку

3) Запустить задание cron, которое удаляет символические ссылки после x часов создания.

...