Перейти к содержимому

Безопасность и эксплуатация — NextPDF на CodeIgniter 4

На этой странице описаны угрозы, от которых должна защищать эта интеграция, меры защиты, проверенные в исходном коде пакета, и правила эксплуатации, которых следует придерживаться для безопасного развёртывания.

Учитывайте три поверхности атаки, на которые злоумышленник может воздействовать.

  1. Полезная нагрузка задания очереди. Очередь хранит данные задания. Злоумышленник с доступом к брокеру может изменить эти данные. Считайте их недоверенными десериализованными входными данными.
  2. Имя файла ответа. Пользователь может задать имя файла для скачивания. Вредоносное имя может внедрить содержимое в заголовок.
  3. Пути в конфигурации. Путь к шрифтам и пути для подписания берутся из конфигурации. Вредоносный путь может привести к чтению из неверного расположения или записи в него.

Мера защиты 1 — список разрешённых полезных нагрузок очереди

Заголовок раздела «Мера защиты 1 — список разрешённых полезных нагрузок очереди»

Задание очереди рассматривает свою полезную нагрузку как недоверенные десериализованные данные. Open Worldwide Application Security Project (OWASP) Application Security Verification Standard (ASVS) требует безопасной обработки ввода для недоверенных десериализованных данных (ASVS V1.5.2).

Проверенные меры защиты в GeneratePdfJob:

  • Построитель должен быть непустой строкой. Задание отклоняет все остальные типы.
  • Построитель должен соответствовать шаблону App\PdfBuilders\<Class>::<method>. Задание отклоняет любое другое пространство имён, обычные функции и полезные нагрузки с префиксом или суффиксом.
  • Построитель должен быть вызываемым. Задание отклоняет строку, которая соответствует шаблону, но не разрешается в вызываемый обработчик.

Вместе эти правила блокируют выполнение произвольного кода через подделанную полезную нагрузку очереди. Тесты пакета проверяют каждый сценарий отклонения.

Мера защиты 2 — ограничение пути вывода очереди

Заголовок раздела «Мера защиты 2 — ограничение пути вывода очереди»

Задание записывает файл на диск. OWASP ASVS требует безопасной обработки путей, когда приложение формирует пути к файлам для операций с файлами (ASVS V5.3.2).

Проверенные меры защиты в GeneratePdfJob:

  • Путь вывода должен быть непустой строкой.
  • Задание нормализует путь до любых проверок. Оно разворачивает сегменты . и .. и преобразует разделители.
  • Нормализованный путь должен находиться внутри WRITEPATH/pdfs/. Задание отклоняет соседний каталог с тем же префиксом имени (pdfs-evil/).
  • Путь должен заканчиваться на .pdf (без учёта регистра).

Эти правила блокируют произвольную запись файлов через подделанную полезную нагрузку.

Мера защиты 3 — усиление заголовков ответа

Заголовок раздела «Мера защиты 3 — усиление заголовков ответа»

PdfResponse добавляет к каждому ответу в формате Portable Document Format (PDF) фиксированный усиленный набор заголовков:

ЗаголовокЗначение
X-Content-Type-Optionsnosniff
X-Frame-OptionsDENY
Content-Security-Policydefault-src 'none'
X-Robots-Tagnoindex, nofollow
Referrer-Policyno-referrer
Cache-Controlprivate, max-age=0, must-revalidate

Пакет очищает имя файла перед добавлением в заголовок. Он удаляет разделители путей, нулевые байты и символы возврата каретки и перевода строки return/line feed (CR/LF). В варианте значения с кавычками он экранирует двойные кавычки. Для имени за пределами ASCII он добавляет параметр filename*=UTF-8''… по Request for Comments (RFC) 5987. Пустое имя заменяется на document.pdf.

Мера защиты 4 — проверка путей в конфигурации

Заголовок раздела «Мера защиты 4 — проверка путей в конфигурации»

Реестр шрифтов отклоняет значение fontsPath, если оно содержит обёртку потока (://) или нулевой байт. В этом случае возникает ошибка времени выполнения. Это блокирует пути с обёртками, такие как php:// или phar://.

Мера защиты 5 — минимальная поверхность локатора сервисов

Заголовок раздела «Мера защиты 5 — минимальная поверхность локатора сервисов»

CodeIgniter 4 не предоставляет контейнер PHP Standards Recommendation 11 (PSR-11), а использует локатор Services. PSR-11 §1.3 рассматривает паттерн локатора сервисов как нежелательный (модальность SHOULD NOT). Пакет оставляет поверхность локатора минимальной: у каждого сервиса есть один именованный фабричный метод. Разрешайте сервисы на границе контроллера. Передавайте вглубь конкретные объекты. Не передавайте класс Services в доменный код.

По умолчанию служба подписания неактивна. Она активируется только тогда, когда signature.enabled равно true, а signature.certificate непусто. Уровень подписи по умолчанию в пакете — B-B. NextPDF Pro предоставляет базовую подпись B-B. Долгосрочная проверка — отдельная возможность Enterprise, описанная в справочнике Premium, а не здесь.

Правила эксплуатации:

  • Храните файлы сертификата и ключа вне системы управления версиями. Передавайте их через .env или менеджер секретов.
  • В продакшене оставляйте tsa.allow_insecure_http равным false. Незашифрованный канал Time Stamping Authority (TSA) недопустим.
  • Задайте tsa.pinned_public_keys, когда TSA публикует стабильный ключ. Оставляйте tsa.warn_on_key_rotation равным true.
  • Ограничьте чтение файла ключа только пользователем приложения.
  • Зафиксируйте все разрешённые версии в composer.lock.
  • Подключите codeigniter4/queue в приложении, которое запускает обработчики.
  • Запускайте обработчик очереди от имени пользователя с низкими привилегиями. Дайте ему доступ на запись только в WRITEPATH/pdfs/.
  • Сделайте доступными для обработчика те же расширения NextPDF, что и для веб-уровня. Для подписанного PDF в среде обработчика требуется NextPDF Pro или Enterprise.
  • Проверьте, что расширения mbstring и zlib доступны в каждой среде выполнения, которая формирует PDF.
  • Проверьте, что заголовки ответа сохраняются после обратного прокси.
  • Логируйте генерацию PDF с контекстом. Не записывайте в журнал материал сертификата или пароли ключей.
  • Обработка полезной нагрузки очереди соответствует OWASP ASVS V1.5.2.
  • Обработка пути вывода очереди соответствует OWASP ASVS V5.3.2.
  • Реализация локатора следует рекомендациям PSR-11 §1.3.

Ядро NextPDF распространяется под лицензией Apache-2.0. Якоря доверия подписи и усиление TSA применяются, когда установлен NextPDF Pro или Enterprise. Пакет CodeIgniter предоставляет соответствующие методы сервиса, которые возвращают null, пока не установлен нужный пакет Premium. См. </get-license/?intent=codeigniter-signing>.

  • /integrations/codeigniter/production-usage/ — корректная регистрация и диспетчеризация очереди.
  • /integrations/codeigniter/configuration/ — ключи конфигурации для подписания, TSA и путей.
  • /integrations/codeigniter/troubleshooting/ — проверенные сообщения об отклонении.
  • /integrations/codeigniter/overview/ — полная поверхность API.