AI генерирует имя скачиваемого файла: как безопасно задать заголовок
Не собирайте HTTP-заголовок скачивания конкатенацией недоверенного имени. Название, предложенное моделью или взятое из документа, должно пройти отдельный контракт, а не становиться произвольным фрагментом ответа сервера.
Пример из разработки
Помощник создаёт отчёт и предлагает понятное имя файла на основе темы запроса. В теме оказываются кавычки, перенос строки или фрагмент пути. Код напрямую вставляет значение в Content-Disposition. В зависимости от стека это приведёт к отказу, повреждённому имени или опасной интерпретации заголовка. Доверие к генерации не заменяет проверку транспортного формата: модель может просто точно повторить недоверенный пользовательский текст.
Почему это работает
Используйте поддерживаемый API фреймворка для скачивания и корректное кодирование параметров имени. Явно отклоняйте недопустимые управляющие символы и задавайте подходящее расширение по реально созданному формату, а не по произвольной рекомендации модели. Для международных имён учитывайте filename и filename* согласно поддержке клиентов. Имя скачивания не должно определять внутренний путь хранения; у объекта может быть независимый серверный идентификатор. Не удаляйте символы молча, если изменение делает названия неоднозначными.
Проверка перед использованием
| Проверка | Ожидаемое поведение |
|---|---|
| Обычное русское имя с пробелами | Клиент получает ожидаемое имя и правильный тип файла без повреждения кодировки или структуры заголовков. |
| Имя содержит кавычку или перевод строки | Сервер применяет явную безопасную политику; значение не создаёт дополнительный заголовок и не попадает в ответ необработанным. |
| В имени указано чужое расширение или путь | Результат сохраняет корректный формат и безопасное имя; путь хранения не выбирается на основании этой строки. |
RFC 6266 описывает передачу имени, но не делает содержимое файла безопасным. Проверки формата, прав на скачивание и самого документа остаются отдельными. Поведение конкретного браузера и фреймворка проверяйте на готовом ответе сервера.
LLM-продукт нужно проверять на границах вывода: сгенерированная строка становится данными для браузера, файловой системы и других исполнителей. В платном курсе LLM Security PRO: Prompt Injection, утечки, tool-abuse можно продолжить изучение соответствующего инженерного направления. Перед покупкой сравните программу и открытые материалы со своей задачей.
Документация для проверки технических деталей: RFC 6266: Content-Disposition.
Следующий шаг: Безопасность LLM-приложений: практические проверки. По смежным вопросам: Картинки в Markdown-ответе AI: как они могут утекать данные, Память AI-агента: как не сохранить чужую команду навсегда.
