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

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 удаляет эти поверхности.

Движок выполняет упорядоченный конвейер:

  1. Разбор входного PDF.
  2. Контроль приёма — проверка, что документ находится в пределах границы приёма (число объектов, число страниц, размер распакованного потока и коэффициент расширения потока, защищающий от входных данных типа «бомба распаковки»). Документ за пределами лимитов отклоняется, а не обезвреживается. Отклонение сообщается отдельно от результата обезвреживания, чтобы ваша обработка ошибок могла их различать.
  3. Обнаружение угроз — сканирование на настроенные типы угроз.
  4. Фильтрация — разбиение объектов на безопасный набор и удаляемый набор.
  5. Очистка ссылок — очистка указателей, оставшихся «висящими» после удаления.
  6. Пересборка — сериализация безопасных объектов в новый PDF.

Обнаруживаемые типы угроз включают встроенные скрипты (и агрессивное удаление скриптов, которое перехватывает скрипты в некорректных структурах), дополнительные действия и триггеры действия открытия, действия запуска, удалённые действия перехода, действия отправки формы и импорта данных, встроенные файлы, мультимедиа и трёхмерное содержимое, деревья имён скриптов уровня документа, внешние действия с Uniform Resource Identifier (URI), данные XML Forms Architecture, поля интерактивных форм, слои необязательного содержимого, отличные от значений по умолчанию, и объекты цифровых подписей (которые пересборка неизбежно делает недействительными, потому что диапазоны байтов больше не совпадают). Объект, который не удаётся разобрать, сам по себе считается потенциальным обходом и удаляется.

Три политики задают значения по умолчанию:

  • Standard — удаляет обнаруживаемые движком настроенные типы угроз активного содержимого; инкрементные обновления всегда «уплощаются» для защиты от затенения подписи, и это уплощение в этом режиме не настраивается.
  • Paranoid — те же удаления с более жёсткими лимитами ресурсов.
  • Permissive — для доверенных источников: удаляет скрипты и действия запуска, но сохраняет действия URI и делает уплощение инкрементных обновлений настраиваемым.

CDR пересобирает новый файл из объектов, признанных безопасными, вместо удаления опасных ключей на месте. Эта позиция «список разрешённого» является несущим решением. Объект, который детектор так и не распознал — включая тот, который он не смог разобрать, — не переживает попадания в результат, поэтому неизвестная структура отказывает закрыто, а не проскальзывает через брешь в списке запрещённого. Контроль приёма выполняется первым по той же причине: вход сверх лимита или неразбираемый вход отклоняется сразу, а никогда не пересобирается частично. Ценой такой безопасности является сохранность. Пересборка меняет компоновку байтов, делает подписи недействительными и отбрасывает полезные нагрузки, чей тип угрозы удаляется, — вот почему результат является проекцией безопасности, а никогда доказательственной копией.

Проектная предыстория: Обезвреживание недоверенных PDF: обезвреживание и реконструкция содержимого.

  1. Установите NextPDF Core и пакет Enterprise и держите активную лицензию Enterprise.
  2. Определите границу приёма для ваших входных данных — максимальное число объектов, число страниц, размер распакованного потока и коэффициент расширения — либо используйте лимиты предустановленной политики.
  3. Выберите политику: standard для общего приёма недоверенных данных, paranoid для самой строгой позиции или permissive только для доверенных источников.

Политика неизменяема и несёт:

  • Типы угроз для удаления — набор, на который сканирует детектор и который удаляет пересборщик.
  • Обработка действий URI — сохраняются ли внешние действия URI.
  • Уплощение инкрементных обновлений — всегда включено в standard и paranoid; настраивается в permissive.
  • Лимиты приёма — максимальное число объектов, число страниц, размер распакованного потока и коэффициент расширения. Это граница приёма, а не поведение обезвреживания; их превышение отклоняет документ.
  1. Прочитайте байты недоверенного PDF.
  2. Выберите политику (standard, paranoid или permissive) или постройте её с явными лимитами.
  3. Запустите операцию обезвреживания движка с байтами и политикой.
  4. Изучите результат: если он сообщает «не принят», отобразите причину отклонения; иначе используйте пересобранные байты и список удалённых угроз.
  5. Считайте пересобранный результат обезвреженной проекцией, а никогда — доказательственной или архивной копией входных данных.
examples/enterprise/cdr-sanitize-guarded.php
<?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;
}
}
  1. Запустите образец, несущий известную поверхность активного содержимого (например, скрипт уровня документа), и убедитесь, что он появляется в списке удалённых угроз и отсутствует в пересобранном результате.
  2. Запустите документ сверх лимита и убедитесь, что результат сообщает «не принят» с причиной отклонения, а пересобранные байты пусты.
  3. Убедитесь, что у цифрово подписанного входа объекты подписи удалены при пересборке — пересборка делает исходную подпись недействительной, потому что диапазоны байтов меняются, поэтому устаревшие объекты подписи удаляются по замыслу.
  4. Откройте пересобранный результат в программе просмотра и убедитесь, что при открытии не выполняется ни один скрипт.
  • Не для доказательств. Пересобранный результат — это деструктивная, необратимая проекция. Не используйте его для сохранения юридических доказательств, для сравнения хешей с оригиналом или как архивную копию. Держите оригинал под отдельным хранением, если вам нужна доказательственная копия.
  • Приём до обезвреживания. Лимиты ресурсов — это граница приёма; документ сверх лимита отклоняется, а не обезвреживается. Сообщайте об отклонении отдельно, чтобы вход сверх лимита никогда не был принят за чистую пересборку.
  • Активное содержимое удаляется. Скрипты, действия запуска, деревья имён скриптов уровня документа, встроенные файлы, мультимедиа и подобные поверхности удаляются — те самые действия, которые программа просмотра иначе бы выполнила (ISO 32000-2 §12.6.4 действие ECMAScript; действие запуска; скрипты уровня документа §7.7.4).
  • Подписи становятся недействительными при пересборке. Поскольку пересборка меняет компоновку байтов, исходная подпись больше не может пройти проверку; объекты подписи удаляются, а не остаются обманчиво на месте.
  • Потери по замыслу. Полезные нагрузки встроенных файлов — включая вложения счетов, такие как Factur-X, — удаляются, когда удаляется их тип угрозы. CDR — это проекция безопасности, а не слой сохранения.

Эта страница касается безопасности документов. Каждый нормативный источник приведён в пересказе; нормативный текст не воспроизводится.

  • Сбой разбора. Документ, который не удаётся разобрать, даёт результат «не принят» с причиной ошибки разбора, а не частичную пересборку.
  • Вход сверх лимита. Результат сообщает «не принят» с причиной, относящейся к лимиту; пересобранные байты пусты.
  • Неразбираемый объект. Объект, который не удаётся разобрать, считается потенциальным обходом и удаляется, а не тихо сохраняется.
  • Подсчёт страниц по принципу наилучшего усилия. Проверка приёма по числу страниц выполняется по принципу наилучшего усилия; некорректный каталог не аварийно завершает конвейер, но лимиты числа объектов и потоков всё равно применяются.

Эта страница документирует только внешне наблюдаемое поведение и поддерживаемую публичную поверхность API. Внутренние пути пространств имён, вспомогательные классы, таблицы механизмов, имена файлов runbook и префиксы тикетов выходят за рамки.