已加载文档净化
SanitiseLoadedDocument 对完整的已加载对象图应用所选的安全策略,并准备一次紧凑的完整重写
配置文件
| 配置文件 | 移除的内容 |
|---|---|
spJavaScriptOnly | 文档 JavaScript 名称树和 JavaScript 动作 |
spActiveContent | JavaScript 加上 launch、远程导航、URI、提交、导入、多媒体、 rendition、XFA 及相关活动内容条目 |
spUntrustedDocument | 所有活动内容,加上内嵌文件、关联文件、文件附件注释、富媒体负载结构,以及在各动作槽位中发现的未知动作类型 |
spRichMediaOnly | 富媒体注释及其分离的负载流 |
spRedactionCleanup | Redact 与文件附件注释、文档信息、元数据、关联与内嵌文件,以及因这些移除而不可达的全部对象 |
声明
function SanitiseLoadedDocument(Profile: THPDFSanitiseProfile;
out Report: THPDFSanitiseReport): Boolean; overload;
function SanitiseLoadedDocument(
out Report: THPDFSanitiseReport): Boolean; overload;
不带配置文件的重载使用 spUntrustedDocument
结果报告
THPDFSanitiseReport 统计已移除的动作、JavaScript 条目、内嵌文件、高风险批注、XFA 条目、载荷流、分离引用、不可达对象和已访问对象
Changed 指示对象图是否发生变化,而 LimitExceeded 和 InvalidObjectGraph 解释被拒绝的预检
安全性和性能
- 该操作以近线性时间为间接对象建立索引并解析引用,而不是反复扫描对象列表
- 一个防循环的预检在任何修改之前访问完整的候选对象图,并拒绝超过两百万个唯一节点的图
- 不受信任的配置文件对附加在承载动作键上的无法识别的动作字典采用失败即关闭策略,同时保留已识别的本地
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或另一个已加载文档工作流成功之后再调用该方法 - 一次成功的调用会强制进行完整重写并退出增量更新模式,因为被移除的字节不能保留在较早的修订版本中
- 该方法移除活动结构和载荷可达性,但不会执行或解释内嵌脚本