Enterprise редакция
Обезвреживание и реконструкция содержимого (CDR)
NextPDF Enterprise нейтрализует недоверенный PDF путём обезвреживания и реконструкции содержимого (CDR): он разбирает файл, проверяет его относительно лимитов приёма, обнаруживает опасные возможности, удаляет их и пересобирает новый файл из оставшихся объектов. Опасные возможности — это активное содержимое (встроенные скрипты, действия запуска, встроенные файлы, мультимедиа и подобное), которое программа просмотра может выполнить или на которое может отреагировать. Эта страница описывает поведение: что движок принимает, что удаляет, что пересобирает и почему результат не является доказательственной копией.
CDR — это деструктивное, одностороннее преобразование. Пересобранный результат — это проекция безопасности входных данных, а не сохранённая или хеш-эквивалентная копия. Эта граница описана в разделе Безопасность и соответствие.
Предварительные требования указаны во фронтматтере и повторены в разделе Предварительные требования.
Доступность и лицензирование
Заголовок раздела «Доступность и лицензирование»Эта возможность поставляется в NextPDF Enterprise (nextpdf/enterprise) и активируется лицензионным конвертом уровня Enterprise. Развёртывание без такого права не загружает классы этой возможности. NextPDF Core и NextPDF Pro не предоставляют CDR. Движок работает внутри процесса; недоверенный документ разбирается и пересобирается на вашем хосте. Сравнить редакции и получить лицензию.
Что делает эта возможность
Заголовок раздела «Что делает эта возможность»PDF поддерживает активное содержимое, которое программа просмотра может выполнить или на которое может отреагировать. Действие ECMAScript заставляет процессор PDF выполнить скрипт, способный изменить значения полей и их внешний вид, согласно ISO 32000-2 §12.6.4. Действие запуска запускает приложение либо открывает или печатает документ, согласно ISO 32000-2 §12.6.4. Скрипты уровня документа в словаре имён выполняются автоматически при открытии документа, согласно ISO 32000-2 §7.7.4. CDR удаляет эти поверхности.
Движок выполняет упорядоченный конвейер:
- Разбор входного PDF.
- Контроль приёма — проверка, что документ находится в пределах границы приёма (число объектов, число страниц, размер распакованного потока и коэффициент расширения потока, защищающий от входных данных типа «бомба распаковки»). Документ за пределами лимитов отклоняется, а не обезвреживается. Отклонение сообщается отдельно от результата обезвреживания, чтобы ваша обработка ошибок могла их различать.
- Обнаружение угроз — сканирование на настроенные типы угроз.
- Фильтрация — разбиение объектов на безопасный набор и удаляемый набор.
- Очистка ссылок — очистка указателей, оставшихся «висящими» после удаления.
- Пересборка — сериализация безопасных объектов в новый PDF.
Обнаруживаемые типы угроз включают встроенные скрипты (и агрессивное удаление скриптов, которое перехватывает скрипты в некорректных структурах), дополнительные действия и триггеры действия открытия, действия запуска, удалённые действия перехода, действия отправки формы и импорта данных, встроенные файлы, мультимедиа и трёхмерное содержимое, деревья имён скриптов уровня документа, внешние действия с Uniform Resource Identifier (URI), данные XML Forms Architecture, поля интерактивных форм, слои необязательного содержимого, отличные от значений по умолчанию, и объекты цифровых подписей (которые пересборка неизбежно делает недействительными, потому что диапазоны байтов больше не совпадают). Объект, который не удаётся разобрать, сам по себе считается потенциальным обходом и удаляется.
Три политики задают значения по умолчанию:
- Standard — удаляет обнаруживаемые движком настроенные типы угроз активного содержимого; инкрементные обновления всегда «уплощаются» для защиты от затенения подписи, и это уплощение в этом режиме не настраивается.
- Paranoid — те же удаления с более жёсткими лимитами ресурсов.
- Permissive — для доверенных источников: удаляет скрипты и действия запуска, но сохраняет действия URI и делает уплощение инкрементных обновлений настраиваемым.
Почему это работает именно так
Заголовок раздела «Почему это работает именно так»CDR пересобирает новый файл из объектов, признанных безопасными, вместо удаления опасных ключей на месте. Эта позиция «список разрешённого» является несущим решением. Объект, который детектор так и не распознал — включая тот, который он не смог разобрать, — не переживает попадания в результат, поэтому неизвестная структура отказывает закрыто, а не проскальзывает через брешь в списке запрещённого. Контроль приёма выполняется первым по той же причине: вход сверх лимита или неразбираемый вход отклоняется сразу, а никогда не пересобирается частично. Ценой такой безопасности является сохранность. Пересборка меняет компоновку байтов, делает подписи недействительными и отбрасывает полезные нагрузки, чей тип угрозы удаляется, — вот почему результат является проекцией безопасности, а никогда доказательственной копией.
Проектная предыстория: Обезвреживание недоверенных PDF: обезвреживание и реконструкция содержимого.
Предварительные требования
Заголовок раздела «Предварительные требования»- Установите NextPDF Core и пакет Enterprise и держите активную лицензию Enterprise.
- Определите границу приёма для ваших входных данных — максимальное число объектов, число страниц, размер распакованного потока и коэффициент расширения — либо используйте лимиты предустановленной политики.
- Выберите политику: standard для общего приёма недоверенных данных, paranoid для самой строгой позиции или permissive только для доверенных источников.
Конфигурация
Заголовок раздела «Конфигурация»Политика неизменяема и несёт:
- Типы угроз для удаления — набор, на который сканирует детектор и который удаляет пересборщик.
- Обработка действий URI — сохраняются ли внешние действия URI.
- Уплощение инкрементных обновлений — всегда включено в standard и paranoid; настраивается в permissive.
- Лимиты приёма — максимальное число объектов, число страниц, размер распакованного потока и коэффициент расширения. Это граница приёма, а не поведение обезвреживания; их превышение отклоняет документ.
Пошагово
Заголовок раздела «Пошагово»- Прочитайте байты недоверенного PDF.
- Выберите политику (standard, paranoid или permissive) или постройте её с явными лимитами.
- Запустите операцию обезвреживания движка с байтами и политикой.
- Изучите результат: если он сообщает «не принят», отобразите причину отклонения; иначе используйте пересобранные байты и список удалённых угроз.
- Считайте пересобранный результат обезвреженной проекцией, а никогда — доказательственной или архивной копией входных данных.
<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use NextPDF\Enterprise\Security\Cdr\CdrEngine;use NextPDF\Enterprise\Security\Cdr\CdrPolicy;use NextPDF\Enterprise\Security\Cdr\CdrResult;use Psr\Log\LoggerInterface;
final readonly class UntrustedPdfIntake{ public function __construct( private CdrEngine $engine, private LoggerInterface $logger, ) {}
/** * Sanitize an untrusted PDF and distinguish rejection from a clean rebuild. * * An over-limit document is rejected by admission control, not sanitized; * the caller surfaces the rejection reason instead of trusting an empty * output. The rebuilt bytes are a security projection, never an * evidentiary copy of the input. * * @param string $pdfBytes The untrusted PDF bytes. * * @return CdrResult The sanitization result, including admission status. */ public function sanitize(string $pdfBytes): CdrResult { $result = $this->engine->sanitize($pdfBytes, CdrPolicy::standard());
if (! $result->admitted) { $this->logger->warning('PDF rejected by CDR admission control', [ 'reason' => $result->rejectionReason, ]);
return $result; }
$this->logger->info('PDF sanitized', [ 'removedThreats' => \count($result->removedThreats), 'originalSize' => $result->originalSize, 'sanitizedSize' => $result->sanitizedSize, ]);
return $result; }}Проверка
Заголовок раздела «Проверка»- Запустите образец, несущий известную поверхность активного содержимого (например, скрипт уровня документа), и убедитесь, что он появляется в списке удалённых угроз и отсутствует в пересобранном результате.
- Запустите документ сверх лимита и убедитесь, что результат сообщает «не принят» с причиной отклонения, а пересобранные байты пусты.
- Убедитесь, что у цифрово подписанного входа объекты подписи удалены при пересборке — пересборка делает исходную подпись недействительной, потому что диапазоны байтов меняются, поэтому устаревшие объекты подписи удаляются по замыслу.
- Откройте пересобранный результат в программе просмотра и убедитесь, что при открытии не выполняется ни один скрипт.
Безопасность и соответствие
Заголовок раздела «Безопасность и соответствие»- Не для доказательств. Пересобранный результат — это деструктивная, необратимая проекция. Не используйте его для сохранения юридических доказательств, для сравнения хешей с оригиналом или как архивную копию. Держите оригинал под отдельным хранением, если вам нужна доказательственная копия.
- Приём до обезвреживания. Лимиты ресурсов — это граница приёма; документ сверх лимита отклоняется, а не обезвреживается. Сообщайте об отклонении отдельно, чтобы вход сверх лимита никогда не был принят за чистую пересборку.
- Активное содержимое удаляется. Скрипты, действия запуска, деревья имён скриптов уровня документа, встроенные файлы, мультимедиа и подобные поверхности удаляются — те самые действия, которые программа просмотра иначе бы выполнила (ISO 32000-2 §12.6.4 действие ECMAScript; действие запуска; скрипты уровня документа §7.7.4).
- Подписи становятся недействительными при пересборке. Поскольку пересборка меняет компоновку байтов, исходная подпись больше не может пройти проверку; объекты подписи удаляются, а не остаются обманчиво на месте.
- Потери по замыслу. Полезные нагрузки встроенных файлов — включая вложения счетов, такие как Factur-X, — удаляются, когда удаляется их тип угрозы. CDR — это проекция безопасности, а не слой сохранения.
Эта страница касается безопасности документов. Каждый нормативный источник приведён в пересказе; нормативный текст не воспроизводится.
Обработка сбоев
Заголовок раздела «Обработка сбоев»- Сбой разбора. Документ, который не удаётся разобрать, даёт результат «не принят» с причиной ошибки разбора, а не частичную пересборку.
- Вход сверх лимита. Результат сообщает «не принят» с причиной, относящейся к лимиту; пересобранные байты пусты.
- Неразбираемый объект. Объект, который не удаётся разобрать, считается потенциальным обходом и удаляется, а не тихо сохраняется.
- Подсчёт страниц по принципу наилучшего усилия. Проверка приёма по числу страниц выполняется по принципу наилучшего усилия; некорректный каталог не аварийно завершает конвейер, но лимиты числа объектов и потоков всё равно применяются.
Граница публикации
Заголовок раздела «Граница публикации»Эта страница документирует только внешне наблюдаемое поведение и поддерживаемую публичную поверхность API. Внутренние пути пространств имён, вспомогательные классы, таблицы механизмов, имена файлов runbook и префиксы тикетов выходят за рамки.
См. также
Заголовок раздела «См. также»- Security — NextPDF Enterprise — объединённая поверхность безопасности Enterprise.
- Validation — NextPDF Enterprise — проверка соответствия созданного или пересобранного PDF.
- Forensics — NextPDF Enterprise — исследование документов и трассировка.
- Security — NextPDF Core — основная поверхность шифрования и подписи.
- CDR · active content · shadow attack — термины глоссария.