Санитаризация загруженного документа
SanitiseLoadedDocument применяет выбранную политику безопасности ко всему загруженному графу объектов и подготавливает компактную полную перезапись
Профили
| Профиль | Удаляемый контент |
|---|---|
spJavaScriptOnly | Name tree JavaScript документа и JavaScript action |
spActiveContent | JavaScript плюс launch, удалённая навигация, URI, submission, import, multimedia, rendition, XFA и связанные записи активного контента |
spUntrustedDocument | Весь активный контент плюс embedded files, associated files, аннотации file-attachment, структуры полезной нагрузки rich-media и неизвестные типы action, найденные в слотах с action |
spRichMediaOnly | Аннотации rich-media и их отсоединённые потоки полезной нагрузки |
spRedactionCleanup | Аннотации redact и file-attachment, информация о документе, метаданные, associated и embedded files и каждый объект, ставший недостижимым из-за этих удалений |
Объявление
function SanitiseLoadedDocument(Profile: THPDFSanitiseProfile;
out Report: THPDFSanitiseReport): Boolean; overload;
function SanitiseLoadedDocument(
out Report: THPDFSanitiseReport): Boolean; overload;
Перегрузка без профиля использует spUntrustedDocument
Отчёт о результате
THPDFSanitiseReport подсчитывает удалённые действия, записи JavaScript, встроенные файлы, рискованные аннотации, записи XFA, потоки полезных нагрузок, отсоединённые ссылки, недостижимые объекты и посещённые объекты
Changed указывает, изменился ли граф объектов, тогда как LimitExceeded и InvalidObjectGraph поясняют отклонённый предпроверкой прогон
Безопасность и производительность
- Операция индексирует непрямые объекты и разрешает ссылки за почти линейное время вместо повторного сканирования списка объектов
- Циклобезопасный preflight обходит весь граф кандидатов до любых изменений и отклоняет графы больше двух миллионов уникальных узлов
- Недоверенный профиль ведёт себя как fail-closed для неопознанных словарей action, привязанных к ключам с action, сохраняя опознанную локальную
GoToнавигацию - Полная перезапись помечает недостижимые непрямые объекты как удалённые и уплотняет номера живых объектов, чтобы убрать осиротевшие байты полезной нагрузки и избежать разреженного выделения кросс-ссылок
- Очистка redaction сознательно сохраняет несвязанные action и поведение страниц, удаляя все недостижимые объекты шрифтов, изображений, полезной нагрузки и метаданных
- Сохранение обратно в путь загруженного источника пишет соседний временный файл и атомарно замещает источник только после успешной перезаписи
Пример
var
Report: THPDFSanitiseReport;
begin
PDF.LoadFromFile('untrusted.pdf');
if not PDF.SanitiseLoadedDocument(spUntrustedDocument, Report) then
raise Exception.Create('Document sanitisation was rejected');
PDF.SaveLoadedDocument('sanitised.pdf');
end;
Примечания по использованию
- Вызывайте метод только после успешного выполнения
LoadFromFileили иного рабочего процесса с загруженным документом - Успешный вызов принудительно выполняет полную перезапись и выходит из режима инкрементных обновлений, поскольку удалённые байты не должны оставаться в более ранней редакции
- Метод удаляет активные структуры и достижимость полезных нагрузок, но не выполняет и не интерпретирует встроенные скрипты