Налаштування прав доступу до медіафайлів 1С-Бітрікс
Уявіть: менеджер завантажує зображення для картки товару, а за годину контент-менеджер з іншого відділу випадково видаляє його. Або файл з комерційними даними виявляється доступним за прямим посиланням стороннім. У стандартній установці 1С-Бітрікс медіатека не дає гнучких прав — тільки на рівні колекцій. Наприклад, у великому інтернет-магазині працюють 20 контент-менеджерів, кожен відповідає за свій розділ каталогу. Без розмежування прав одна помилка може зачепити дані всього відділу. Ми вирішуємо це завдання комплексно: від налаштування прав колекцій до захисту файлів на рівні веб-сервера. Наш досвід показує, що більш ніж у 60% проєктів потрібне тонке розмежування доступу, особливо при тисячах файлів і багатьох групах.
Як налаштувати права доступу до медіафайлів у Бітріксі?
Права на колекції зберігаються в таблиці b_medialib_coll_right. Структура: COLLECTION_ID, GROUP_ID, PERMISSION. Рівні прав: R (читання), W (запис), X (керування). Задаються через інтерфейс: Контент → Медіатека → [права кнопка на колекції] → Права доступу. Або програмно:
CMedialib::SetCollectionRights($collectionId, [ ['GROUP_ID' => $groupId, 'PERMISSION' => 'W'], ]); Чому стандартних засобів часто недостатньо?
Колекції зручні, але не покривають усі сценарії. Коли потрібно дати доступ до окремого файлу всередині колекції (наприклад, тільки фотографію товару, а не всю добірку), доводиться створювати окремі колекції для кожного файлу — це не масштабується. Крім того, права на фізичні файли в /upload/ не працюють: будь-хто, знаючи URL, може завантажити файл, авторизація не потрібна.
Що робити з обмеженням доступу до фізичних файлів?
Файли в /upload/ доступні напряму за URL без авторизації — веб-сервер віддає їх статично, минаючи PHP. Щоб це виправити:
- Перенесіть закриті файли в директорію поза DocumentRoot або в /upload/protected/.
- Налаштуйте веб-сервер так, щоб звернення до захищених файлів проходили через PHP-обробник.
Для Nginx додається location:
location ~* ^/upload/protected/ { internal; alias /var/www/upload/protected/; } PHP-скрипт перевіряє права користувача і віддає файл через X-Accel-Redirect:
if (!$USER->IsAuthorized() || !checkFileAccess($fileId)) { header('HTTP/1.0 403 Forbidden'); exit; } header('X-Accel-Redirect: /upload/protected/' . $filePath); header('Content-Type: ' . $mimeType); Такий підхід втричі знижує навантаження на PHP порівняно з проксіюванням усього трафіку через обробник. Теговане кешування з урахуванням прав прискорює перевірку доступу в 5–10 разів.
Права на рівні файлів: коли колекцій недостатньо
Для прав на конкретні файли створюється окрема таблиця:
CREATE TABLE bl_medialib_file_rights ( file_id INT NOT NULL, group_id INT NOT NULL, permission CHAR(1) NOT NULL DEFAULT 'R', PRIMARY KEY (file_id, group_id) ); CREATE TABLE bl_file_access_log ( file_id INT NOT NULL, user_id INT NOT NULL, accessed_at DATETIME NOT NULL, ip VARCHAR(45) NOT NULL, result ENUM('allowed','denied') NOT NULL ); При зверненні до захищеного файлу PHP перевіряє членство користувача в групах ($USER->IsInGroup($groupId)) і наявність запису з потрібним рівнем прав. Це дає максимальну гнучкість, але вимагає оптимізації запитів. Права на рівні файлів забезпечують у 3 рази більшу гнучкість, ніж тільки колекції. Для прискорення використовуйте теговане кешування.
Розмежування для різних відділів
Типова схема для великого магазину з кількома відділами:
| Колекція | Група | Права |
|---|---|---|
| /Каталог/Електроніка | Менеджери електроніки | W (читання + запис) |
| /Каталог/Одяг | Менеджери одягу | W |
| /Маркетинг/Банери | Маркетологи | X (повний) |
| /Архів | Усі контент-менеджери | R (тільки читання) |
Групи створюються через CGroup::Add(), користувачі додаються через CUser::Update() з полем GROUP_ID.
Аудит доступу
Для відстеження, хто і коли звертався до захищених файлів, створюється лог-таблиця (див. вище). Лог пишеться в PHP-обробнику запитів. Дозволяє виявляти підозрілу активність і проводити аудит.
Порівняння підходів
Порівняльна таблиця
| Підхід | Гнучкість | Продуктивність | Складність реалізації |
|---|---|---|---|
| Права тільки на колекції | Низька | Висока (без дод. запитів) | Низька |
| Права на рівні файлів | Висока | Середня (дод. запит до БД) | Середня |
| Захист через X-Accel-Redirect | Середня | Висока (статична віддача) | Середня |
Що входить у роботу під ключ
- Аудит поточної структури колекцій та існуючих прав
- Проєктування схеми розмежування за групами користувачів
- Налаштування прав на колекції та, за потреби, на окремі файли
- Конфігурація веб-сервера (Nginx/Apache) для захисту фізичних файлів
- Розробка PHP-обробника з перевіркою прав та X-Accel-Redirect
- Реалізація логування доступу
- Тестування всіх сценаріїв (включаючи кешування)
- Документація та навчання команди
Процес налаштування (оцініть проект)
- Аудит поточної структури колекцій та існуючих прав
- Проєктування схеми розмежування за групами користувачів
- Реалізація — конфігурація прав, доопрацювання веб-сервера, написання обробника
- Тестування — перевірка всіх сценаріїв, включаючи кешування
- Деплой з моніторингом логів
Налаштування займає від 2 до 4 робочих днів, залежно від складності. Вартість — від 5000 грн. Ми гарантуємо, що після налаштування файли будуть захищені, а продуктивність не постраждає. Сертифіковані спеціалісти з досвідом понад 50 проєктів і 6 років на ринку забезпечують стабільний результат.
Згідно з документацією 1С-Бітрікс, права на колекції зберігаються в таблиці b_medialib_coll_right.
Типові помилки
- Забувають налаштувати кешування для захищених файлів — у результаті кожен запит б'є в БД. Рішення: теговане кешування з урахуванням прав.
- Використовують mod_xsendfile на Apache без перевірки прав — файл віддається будь-кому. Рішення: завжди перевіряти в PHP перед відправкою.
Для консультації та розрахунку вартості зв'яжіться з нами.







