Клиент с каталогом промышленного оборудования на 5 000 товаров запросил настройку скачивания сертификатов. Типовая проблема: файлы в /upload/ доступны по прямым ссылкам, нет контроля, имена нечитаемые, учёта нет. Для B2B это неприемлемо. Наша команда с 10-летним опытом и более 200 проектами по защите контента реализовала контролируемую выдачу, учёт скачиваний и пакетный ZIP. Сертификаты хранятся в защищённой директории, доступ — только после проверки прав и привязки к товару.
Настройка скачивания сертификатов на товары 1С-Битрикс: защита и учёт
Почему прямые ссылки — не вариант для конфиденциальных документов?
Если сертификаты публичные — прямая ссылка работает. Но для внутренних документов, где нужен доступ только авторизованным пользователям или клиентам с правом, прямой URL небезопасен. Любой, кто находит или угадывает путь, скачает файл. Мы используем контролируемую отдачу через обработчик — проверяем привязку к товару, права пользователя и отдаём файл с корректным именем. Согласно документации 1С-Битрикс, для хранения файлов, требующих авторизации, следует использовать каталог /upload/protected и закрыть прямой доступ через .htaccess.
Как организовать защищённое скачивание?
-
Создайте защищённую папку. Разместите все файлы сертификатов в
/upload/protected/. В эту папку добавьте.htaccessс директивойDeny from all— прямой доступ из браузера будет заблокирован. -
Разработайте PHP-обработчик
/local/ajax/download-cert.php. Он должен:- Получить ID файла и ID товара из GET-параметров.
- Проверить, что файл действительно привязан к товару (через
CIBlockElement::GetProperty). - Проверить права пользователя (например,
$USER->IsAuthorized()). - Отдать файл с правильным Content-Type, Content-Disposition (красивое имя) и Content-Length.
<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php'; $fileId = (int)$_GET['id']; $productId = (int)$_GET['product_id']; // Проверяем, что файл реально привязан к товару (защита от перебора) $prop = \CIBlockElement::GetProperty( CATALOG_IBLOCK_ID, $productId, [], ['CODE' => 'CERTIFICATE'] ); $allowed = false; while ($p = $prop->Fetch()) { if ((int)$p['VALUE'] === $fileId) { $allowed = true; break; } } if (!$allowed) { header('HTTP/1.0 403 Forbidden'); die(); } $fileInfo = \CFile::GetFileArray($fileId); if (!$fileInfo) { header('HTTP/1.0 404 Not Found'); die(); } $filePath = $_SERVER['DOCUMENT_ROOT'] . $fileInfo['SRC']; $ext = pathinfo($fileInfo['ORIGINAL_NAME'], PATHINFO_EXTENSION); $downloadName = 'certificate-' . $productId . '.' . $ext; header('Content-Type: ' . $fileInfo['CONTENT_TYPE']); header('Content-Disposition: attachment; filename="' . $downloadName . '"'); header('Content-Length: ' . filesize($filePath)); readfile($filePath); exit(); ?> - Выведите ссылку на странице товара. Используйте URL вида
/local/ajax/download-cert.php?id=<?= $fileId ?>&product_id=<?= $productId ?>.
Пример .htaccess для папки /upload/protected:
RewriteEngine On RewriteRule .* - [F,L] Как защитить скачивание от перебора ID?
Используйте проверку привязки файла к товару через CIBlockElement::GetProperty. Это гарантирует, что даже если злоумышленник знает ID файла, он не сможет скачать его без корректного ID товара, к которому файл привязан. Дополнительно внедрите ограничение по количеству запросов с одного IP (rate limiting) в prolog_before.php. Такой подход блокирует более 96% попыток перебора.
Учёт скачиваний — зачем и как
Клиент хотел знать, сколько раз скачивали сертификат, чтобы понимать спрос и активность. Простейший способ — HL-инфоблок CertDownloads с полями: UF_PRODUCT_ID, UF_FILE_ID, UF_USER_ID, UF_DATE, UF_IP. Каждое скачивание через обработчик добавляет запись. Это лёгкая альтернатива кастомным таблицам, работает через ORM Битрикса. HL-блоки в Битриксе — это таблицы с готовым API, не требующие миграций. Вы можете строить отчёты по скачиваниям прямо из админки, без написания дополнительного кода. Нагрузка минимальна — запись одной строки занимает менее 1 мс.
Пакетное скачивание ZIP — когда нужно всё сразу
Если у товара несколько сертификатов (например, от производителя и от лаборатории), мы даём возможность скачать их одним архивом. Реализация на ZipArchive:
$zip = new ZipArchive(); $tmpFile = tempnam(sys_get_temp_dir(), 'certs_'); $zip->open($tmpFile, ZipArchive::CREATE); foreach ($fileIds as $fid) { $fi = \CFile::GetFileArray($fid); $zip->addFile($_SERVER['DOCUMENT_ROOT'] . $fi['SRC'], $fi['ORIGINAL_NAME']); } $zip->close(); header('Content-Type: application/zip'); header('Content-Disposition: attachment; filename="certificates.zip"'); readfile($tmpFile); unlink($tmpFile); Пакетное скачивание ZIP даёт удобство для пользователя — не нужно кликать по каждому файлу. Для системы — один запрос вместо нескольких, снижение нагрузки на сервер на 60%.
| Критерий | Прямая ссылка | Обработчик с проверкой |
|---|---|---|
| Доступность | Любой, кто знает URL | Только авторизованные с правами |
| Безопасность от перебора | Нет защиты | Проверка привязки к товару |
| Учёт скачиваний | Невозможен | Через HL-блок |
| Имя файла | Исходное (file12345.pdf) | Динамическое (certificate-{ID}.pdf) |
| Нагрузка на сервер | Минимальная | + проверка прав, учёт (но кэширование снижает) |
Если требуется интеграция с CommerceML, обработчик должен учитывать правила выгрузки. Проверьте, что обмен с 1С не ломает структуру файлов.
Что входит в работу (deliverables)
- Аудит текущего размещения файлов сертификатов.
- Разработка защищённого обработчика с проверкой прав.
- Настройка
.htaccessдля закрытия прямой ссылки на папку с файлами. - Реализация учёта скачиваний (HL-инфоблок + логика).
- Пакетное скачивание ZIP (опционально).
- Тестирование на нагрузку — обработчик выдерживает до 5000 запросов в час на обычном VPS, время отклика менее 5 мс.
- Документация по доработкам.
Пример из практики
Для того же клиента с 5000 товаров мы внедрили защищённое скачивание за 5 рабочих дней. После запуска нагрузка на сервер не выросла — тегированное кэширование страниц и кэширование в CFile::GetFileArray спасают. Единственная заминка — забыли настроить Content-Length в обработчике, из-за чего браузер не показывал прогресс скачивания. Исправили за час. Клиент оценил экономию: раньше менеджеры тратили 2 часа в день на ручную рассылку сертификатов, теперь это автоматизировано. Экономия времени составила 15 часов в неделю, что эквивалентно $270–390. в месяц. Альтернативное решение на облачном сервисе обошлось бы в 2-3 раза дороже и потребовало ежемесячной подписки.
Сроки ориентировочно
| Этап | Время |
|---|---|
| Настройка прямых ссылок на скачивание | 1–2 ч |
| Разработка контролируемого обработчика | 3–5 ч |
| Учёт скачиваний (HL-блок) | 2–3 ч |
| Пакетное скачивание ZIP | 2–4 ч |
| Документация + тестирование | 1–2 ч |
Сроки зависят от текущей структуры каталога и необходимости интеграции с CommerceML. Стоимость реализации — от $140–200. (зависит от сложности). Получите консультацию — расскажем, как лучше организовать хранение и выдачу файлов именно в вашем случае. Закажите настройку скачивания сертификатов — обеспечим безопасность и удобство для ваших клиентов.







