Безопасный способ хранения файлов на веб-сервере? - PullRequest
19 голосов
/ 05 января 2011

Я хочу, чтобы мои файлы были защищены на моем веб-сервере. Только аутентифицированные пользователи для доступа к этим файлам должны иметь доступ к этим файлам. Я думал о хранении файлов в базе данных как "Long BLOB", но он поддерживает только до 2 МБ данных. Размер файла может превышать 50 МБ. Есть ли другой лучший способ защитить файлы? Пожалуйста, помогите мне. Спасибо заранее.

Ответы [ 7 ]

23 голосов
/ 05 января 2011

Не храните их в базе данных.Поместите их в свой веб-каталог и защитите их, используя .htaccess.

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

5 голосов
/ 05 января 2011

На ум приходит несколько вариантов.

Если вы используете Apache, вы можете использовать htaccess для защиты паролей каталогов. (первая поисковая ссылка: http://www.javascriptkit.com/howto/htaccess3.shtml)

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

Если вы хотите сделать это через FTP, и вы используете cpanel, вы можете создать новые учетные записи ftp. проверьте yourdomain.com/cpanel, чтобы определить, установлен ли он у вас.

4 голосов
/ 05 января 2011

Хранение файлов в БД - очень плохая практика.Очень хорошая практика для хранения только информации о файле.Имя, расширение.Файлы сохраняются на сервере как $ id. $ Ext.Это будет хорошая архитектура.И когда пользователь скачивает файл, он берет файл с именем в БД.Извините за мой английский.

2 голосов
/ 18 апреля 2017

Обсуждение

Если вы решите хранить загружаемые файлы содержимого высокого уровня непосредственно в файловой системе , лучше всего держать их вне webroot . Затем вашему приложению придется решить проблему создания URL-адресов (при необходимости, кодирования URL) для содержимого (PDF-файлы, документы Word, песни и т. Д.).

Как правило, это может быть достигнуто с помощью запроса для получения пути к файлу, а затем с помощью пути к файлу для отправки содержимого пользователю (с помощью header() и т. Д.), Когда он или она нажимает на привязку (все при этом пользователь никогда не увидит истинный путь к файлу на стороне сервера).

Если вы не хотите, чтобы пользователь A обменивался URL-адресами для загружаемого контента с высокой ценностью для пользователя B , то ваше приложение должно каким-то образом сделать ссылки исключительно привязанными к пользователю A . Что можно сделать? С чего мне начать?

Очевидно, вы хотите убедиться, что пользователь A вошел в систему во время сеанса, прежде чем он или она сможет загрузить файл. не так очевидно состоит в том, как запретить вошедшему в систему пользователю B использовать URL-адрес, отправленный пользователем A (пользователю B ) для загрузки A цифрового контента.

Использование $_SESSION для хранения зарегистрированного идентификатора пользователя (числовое или строковое) и выполнение этой части возможного запроса (при условии, что контент привязан к покупкам пользователя или чем-то еще) предотвратит вход в систему пользователя B при загрузке вещей, которые они не приобрели , но вы по-прежнему будете подвергаться попаданию ресурса для обработки пустого набора SQL для элементов, которые у них не куплены . Это звучит как хороший второй шаг.

А как насчет первого шага? Есть ли что-то, что может предотвратить необходимость делать запрос для начала?

Хорошо, давайте посмотрим. В HTML-формах можно использовать токен XSRF в скрытом поле, чтобы убедиться, что отправленная форма действительно возникла с веб-сервера, который получает запрос POST / GET. Один токен используется для всей формы.

При наличии страницы пользовательских вещей, которые нужно загрузить (якоря), можно вставить один токен (тот же токен, но разный для каждого запроса страницы) в атрибут href каждого якоря в виде параметра строки запроса и сохранить копия этого токена в $_SESSION.

Теперь, когда вошедший в систему пользователь B пытается использовать вошедшего в систему пользователя A shared URL, все завершается неудачно, потому что user A и user B имеют разные сеансы (или вообще без сеансов) и, следовательно, разные токены. Другими словами: «Моя ссылка такая же, как ваша, но другая». Якоря будут привязаны к сеансу, а не только к странице, пользователю или контенту.

С этой системой PHP может определить, является ли запрос контента допустимым, не задействуя базу данных (сравнивая отправленный токен с токеном в $_SESSION). Более того, в $_SESSION может быть установлен лимит времени для ограничения продолжительности / времени жизни действующего токена XSRF. Просто используйте функцию time() и базовую математику. Шестьдесят минут могут быть идеальным временем жизни токена для якоря в этой ситуации. Пройдите вход пользователя еще раз, если токен для привязанного якоря истек.

Резюме

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

  1. Примените надлежащие права доступа к файлу для вашего каталога содержимого (вне webroot).
  2. Использовать случайные имена для загружаемых файлов.
  3. Проверьте наличие повторяющихся имен файлов перед сохранением файла из загрузки.
  4. Только зарегистрированные пользователи должны иметь возможность загружать высококачественное содержимое.
  5. Наличие эффективной $_SESSION системы, которая препятствует фиксации сеанса.
  6. Сделать URL-адреса для загружаемого контента высокой ценности уникальными для каждой страницы с помощью хешированных маркеров XSRF.
  7. Токены XSRF покрывают больше сценариев, когда они имеют срок службы терминала.
  8. Выполнение SQL-запросов для пользовательского контента на основе зарегистрированного идентификатора пользователя, а не только продукта.
  9. Фильтрация и проверка всех пользовательских данных.
  10. Использовать подготовленные операторы с запросами SQL.
1 голос
/ 24 января 2012

Загружаемые файлы могут храниться в защищенной папке htaccess / s. Сценарий, подобный приведенному ниже, можно использовать для создания динамических ссылок для загружаемых файлов.

например Безопасные ссылки для скачивания. http://codecanyon.net/item/secure-download-links/309295

0 голосов
/ 05 января 2011

Если файлы являются чисто статическими, вы можете использовать носитель только для чтения или WORM для хранения файлов данных или действительно запустить весь веб-сервер с «LiveCD». Это, конечно, не подходит для всех, но в ограниченных случаях, когда целостность данных имеет первостепенное значение, он работает.

0 голосов
/ 05 января 2011

Лучший способ - сохранить ссылку на файл в базе данных.Сам файл будет храниться в файловой системе сервера.Сложность этого заключается в том, чтобы обеспечить целостность ссылок между ссылкой на файл базы данных и существующим файлом в файловой системе сервера.В некоторых базах данных, таких как sql server 2008, есть функция, которая поддерживает целостность ссылок на файл для самого файла.

Помимо защиты самого файла на сервере, зависит от ОС, в которой можно настроить разрешенияопределенная папка, в которой находится файл.

...