Loaded Document Sanitisation
SanitiseLoadedDocument는 선택된 보안 policy를 로드된 객체 그래프 전체에 적용하고 컴팩트 전체 재작성을 준비합니다
Profiles
| Profile | Removed content |
|---|---|
spJavaScriptOnly | 문서 JavaScript 이름 트리와 JavaScript action |
spActiveContent | JavaScript와 launch, 원격 내비게이션, URI, 제출, 가져오기, 멀티미디어, rendition, XFA 등 관련 active-content 항목 |
spUntrustedDocument | 모든 active content에 더해 action 자리에서 발견되는 내장 파일, associated 파일, 파일 첨부 주석, rich-media 페이로드 구조, 미지원 action 타입 |
spRichMediaOnly | rich-media 주석과 분리된 페이로드 stream |
spRedactionCleanup | Redact/파일 첨부 주석, 문서 정보, 메타데이터, associated/내장 파일, 그 제거로 도달 불가가 된 모든 객체 |
선언
function SanitiseLoadedDocument(Profile: THPDFSanitiseProfile;
out Report: THPDFSanitiseReport): Boolean; overload;
function SanitiseLoadedDocument(
out Report: THPDFSanitiseReport): Boolean; overload;
function ScrubLoadedRedactionRemnants(
out Report: THPDFSanitiseReport): Boolean;
프로파일 없는 overload는 spUntrustedDocument를 씁니다
결과 보고서
THPDFSanitiseReport는 제거된 action, JavaScript 항목, 내장 파일, 위험 주석, XFA 항목, 페이로드 stream, 분리된 참조, 도달 불가 객체, 메타데이터 항목, Redact 주석, 버려진 이전 revision 바이트, 방문한 객체를 셉니다
Changed는 객체 그래프가 바뀌었는지 알려주고, LimitExceeded와 InvalidObjectGraph는 거부된 preflight의 사유를 설명합니다
안전과 성능
- 이 operation은 객체 목록을 반복 스캔하는 대신 준선형 시간에 indirect 객체를 인덱싱하고 참조를 해석합니다
- cycle-safe preflight는 변경 전에 후보 그래프 전체를 방문하고, 고유 노드 200만 개를 넘는 그래프는 거부합니다
- 신뢰 불가 프로파일은 action 자리 키에 붙은 미인식 action 딕셔너리에서 fail-closed 하면서 인식된 로컬
GoTo내비게이션은 유지합니다 - 전체 재작성은 도달 불가 indirect 객체를 삭제 표시하고 live 객체 번호를 압축해 고아 페이로드 바이트를 없애고 희소 cross-reference 할당을 피합니다
- 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등 로드 문서 워크플로가 성공한 뒤에만 호출합니다 - 성공한 호출은 전체 재작성을 강제하고 증분 업데이트 모드를 빠져나옵니다. 제거된 바이트가 이전 revision에 남으면 안 되기 때문입니다
- 이 메서드는 active 구조와 페이로드 도달 가능성을 제거하지만 내장 스크립트를 실행하거나 해석하지는 않습니다