← К заметкам

Заметки

Что возвращает CFile::GetPath и как проверить ссылку на файл

CFile::GetPath возвращает путь по ID обычного файла. Сам вызов не создаёт контроллер скачивания и не проверяет право получателя ссылки на CRM-карточку или задачу.

Получить путь в коробке

Фрагмент выполняется с подключённым ядром. Он получает путь, но не публикует его пользователю.

<?php

$file_id = 123;
$file_path = CFile::GetPath($file_id);
if ($file_path === '') {
    throw new RuntimeException('Файл не найден.');
}

Если путь ведёт к файлу в /upload, доступность прямого URL определяется настройкой веб-сервера и хранения. Нельзя считать его защищённым только потому, что ID был получен из закрытой карточки.

Публичная ссылка — отдельное решение

У Диска есть disk.file.getExternalLink, но его результат предназначен для публичного доступа. Не используйте этот метод как замену защищённому скачиванию конфиденциальных документов.

Что делать с закрытым документом

Используйте штатный механизм скачивания, соответствующий исходной сущности, или свой авторизованный контроллер. Перед выдачей файла контроллер должен проверять право пользователя на объект и принадлежность файла этому объекту; одного входящего file_id недостаточно.

Проверяйте конечный URL без сессии и под пользователем без доступа. ID файла Диска не подставляется в CFile::GetPath напрямую. Разбор доступа к файлу Диска.

Источники