読み込んだドキュメントのサニタイズ
SanitiseLoadedDocument は選択されたセキュリティポリシーを完全に読み込まれたオブジェクトグラフに適用し、コンパクトな完全再書き込みを準備します
プロファイル
| プロファイル | 削除されたコンテンツ |
|---|---|
spJavaScriptOnly | ドキュメント JavaScript の名前ツリーと JavaScript アクション |
spActiveContent | JavaScript に加えて、launch・リモートナビゲーション・URI・送信・インポート・マルチメディア・レンディション・XFA、および関連するアクティブコンテンツのエントリ |
spUntrustedDocument | すべてのアクティブコンテンツに加えて、埋め込みファイル・関連ファイル・添付ファイル注釈・リッチメディアのペイロード構造、およびアクション保持スロットに見つかった未知のアクションタイプ |
spRichMediaOnly | リッチメディア注釈と、切り離されたペイロードストリーム |
spRedactionCleanup | 黒塗り注釈と添付ファイル注釈・文書情報・メタデータ・関連ファイルと埋め込みファイル、およびこれらの削除によって到達不能になったすべてのオブジェクト |
宣言
function SanitiseLoadedDocument(Profile: THPDFSanitiseProfile;
out Report: THPDFSanitiseReport): Boolean; overload;
function SanitiseLoadedDocument(
out Report: THPDFSanitiseReport): Boolean; overload;
プロファイルなしのオーバーロードは spUntrustedDocument を使用します
結果レポート
THPDFSanitiseReport は削除されたアクション、JavaScript エントリ、埋め込みファイル、リスクの高い注釈、XFA エントリ、ペイロードストリーム、切り離された参照、到達不能なオブジェクト、および訪問したオブジェクトをカウントします
Changed はオブジェクトグラフが変更されたかどうかを示し、LimitExceeded と InvalidObjectGraph は preflight が拒否された理由を示します
安全性とパフォーマンス
- この操作は間接オブジェクトにインデックスを付け、オブジェクトリストを繰り返し走査する代わりにほぼ線形時間で参照を解決します
- サイクルセーフのプリフライトが、いかなる変更の前にも候補グラフ全体を訪問し、一意ノード数が 200 万を超えるグラフを拒否します
- 信頼できないプロファイルでは、アクションを保持するキーに付属する未知のアクションディクショナリに対して fail closed します。認識されたローカル
GoToナビゲーションは保持します - 完全な書き直しでは、到達不能な間接オブジェクトを削除済みとしてマークし、有効なオブジェクト番号を圧縮します。孤立したペイロードバイトを取り除き、まばらなクロスリファレンス割り当てを避けるためです
- 黒塗りクリーンアップでは、無関係なアクションとページ動作を意図的に保持しつつ、到達不能になったフォント・画像・ペイロード・メタデータの各オブジェクトをすべて取り除きます
- 読み込んだソースパスへの保存では、隣接する一時ファイルに書き出し、書き直しが成功した後でだけ、原子的にソースを置き換えます
例
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または別の読み込み済みドキュメントワークフローが成功した後にのみメソッドを呼び出してください- 成功した呼び出しは完全再書き込みを強制し、インクリメンタル更新モードを終了します。削除されたバイトが以前のリビジョンに残ってはならないためです
- このメソッドはアクティブな構造とペイロードの到達可能性を削除しますが、埋め込みスクリプトを実行または解釈することはありません