Простое решение для ограничения доступа к (некоторым) загрузкам и скачиваниям в WordPress
Исходная ситуация
При настройке сайта я изучал вопрос защиты загрузок/скачиваний и ограничения доступа к ним на основе ролей/возможностей пользователей. Конечно, я прочитал некоторые предыдущие вопросы по этой (общей) теме, для справки самые важные/интересные из найденных:
- Как защитить загрузки, если пользователь не авторизован?
- Как ограничить доступ к загруженным файлам?
- Ограничение доступа к файлам в определенной папке
- Как сделать медиафайлы приватными?
- Интеграция PHP скрипта для скачивания в `functions.php`
Дополнительные примечания
Вообще не лишним будет дополнительно улучшить безопасность вашей WordPress установки - например, защитить ваш wp-config.php
- есть много вещей, которые можно и нужно сделать. В интернете полно информации о том, как это сделать. В контексте этого вопроса меня в основном волнуют мои загрузки/скачивания.
Загрузки WordPress не защищены, любой может просматривать папку uploads
, если вы не предотвратите это с помощью .htaccess
:
Options All -Indexes
Файл .htaccess
должен быть размещен внутри папки uploads
. Но это не совсем защищает файлы, а лишь затрудняет их поиск. Дополнительно можно предотвратить хотлинкинг
, по сути ограничивая доступ на основе реферера
- хотя это несколько другой случай, я упомянул об этом, но не буду подробно останавливаться, информации об этом предостаточно.
Конечно, есть возможность сделать записи приватными или создать пользовательский тип записи с подходящими файлами шаблонов, чтобы сделать этот тип записи приватным, но это не защищает ваши файлы. То же самое можно сказать об оборачивании файлов в условные конструкции типа is_user_logged_in()
или is_admin()
.
На заметку: существует множество плагинов, которые обещают сделать ваши файлы защищенными, но многие из них лишь создают видимость защиты по причинам, указанным выше. Я обращаю на это внимание, потому что уверен, что не все об этом знают - так что будьте внимательны.
Цель
Моей целью была возможность ограничить доступ к (некоторым) загрузкам и соответственно скачиваниям. И убедиться, что никто посторонний не сможет получить к ним доступ ни случайно, ни зная имя файла - файлы должны быть действительно приватными и защищенными. В конечном счете доступ должны иметь только определенные люди без исключений.
Дополнительно мне не нужно было делать приватным весь сайт - это было бы контрпродуктивно, так как он используется для публичной презентации. Более того, я хотел, чтобы решение было простым в использовании, по той простой причине, что некоторые работающие с ним люди не являются экспертами в компьютерах, как это часто бывает.
Вопрос
Собственно вопрос: существует ли (относительно) простой способ ограничить доступ к (некоторым) загрузкам и соответствующим скачиваниям? И, как я изложил, это означает способ действительно защитить и обезопасить их?

Я отвечаю на свой собственный вопрос, потому что нашел решение, но мне очень интересно узнать ваше мнение по этому поводу. Возможно, у вас есть гораздо лучшее решение — если так, я бы очень хотел о нем услышать.
Результаты исследования
В результате исследования я пришел к следующим выводам:
1. Размещать файлы за пределами корневой директории www
;
2. Запретить прямой доступ к папке с файлами;
3. Обрабатывать запросы к файлам через скрипт;
Источники для этих пунктов — по крайней мере, в основном — включены в мой вопрос.
Решение
- Я установил плагин »wp-downloadmanager«
- в процессе установки создается папка
files
внутриwp-content
;
- в процессе установки создается папка
- Я добавил файл
.htaccess
в новую папкуfiles
:- содержимое файла
.htaccess
:
Options All -Indexes
Order Deny,Allow
Deny from all
- содержимое файла
- Я изменил одну важную настройку плагина:
- настройка называется
download method
; - я изменил её на
output file
;
- настройка называется
- Я добавил несколько файлов через интерфейс плагина:
- есть опция
allowed to download
; - она позволяет ограничить доступ на основе роли/возможностей пользователя;
- есть опция
- Я провел тестирование:
- нет прямого доступа к файлам — ни через адресную строку, ни через wget;
- публичные загрузки доступны по их постоянным ссылкам — я выбрал »nice permalinks: yes« и »download url: file id« в панели настроек — доступ через адресную строку/wget тоже работает;
- защищенные, ограниченные загрузки доступны только для авторизованных пользователей с соответствующими ролями/возможностями;
Заключительные мысли
Я считаю, что решение в целом соответствует результатам исследования. За исключением размещения файлов за пределами корневой директории. Но ограничение доступа к папке и обработка запросов через скрипт реализованы. Ограничение доступа обеспечивается файлом .htaccess
, а роль скрипта выполняет плагин wp-downloadmanger
.
Дополнительные примечания
- Крайне важно изменить
download method
наoutput file
; и, конечно же, обязательно наличие файла
.htaccess
;чтобы убедиться, что плагин выполняет роль скрипта, взгляните на файл
wp-downloadmanger.php
— строки с 207 по 227 (версия 1.6.1); это дополнение к приведенной информации.
