
本文介绍如何基于 apache pdfbox 构建 pdf 安全清理能力,重点移除 javascript、嵌入动作(launch/submitform/goto)、富媒体及可疑对象,提升 web 文件上传环节的安全性。
在 Spring Web 应用中处理用户上传的 PDF 文件时,仅依赖杀毒引擎不足以防范 PDF 特有的攻击面——例如嵌入的 JavaScript、自动执行的动作(如 OpenAction、JavaScript 等)、隐藏的富媒体对象或恶意命名对象流。真正有效的“PDF 消毒”(sanitization)需在解析层主动识别并剥离高风险内容,而非简单黑白名单过滤。
Apache PDFBox 本身不提供开箱即用的“消毒”API,但它是构建此类能力的坚实基础。推荐以 DocBleach 项目为起点——一个专为办公文档(PDF、DOCX、XLSX)设计的开源消毒框架,其 PDF 模块完全基于 PDFBox 2.x 实现,并已通过实际安全审计验证。尽管项目目前处于归档状态(Archived),其核心逻辑清晰、无外部闭源依赖,仍可安全集成至生产环境。
✅ 核心消毒策略(基于 DocBleach + PDFBox)
以下为关键清理项及对应实现思路(伪代码+关键 API):
大小仅1兆左右 ,足够轻便的商城系统; 易部署,上传空间即可用,安全,稳定; 容易操作,登陆后台就可设置装饰网站; 并且使用异步技术处理网站数据,表现更具美感。 前台呈现页面,兼容主流浏览器,DIV+CSS页面设计; 如果您有一定的网页设计基础,还可以进行简易的样式修改,二次开发, 发布新样式,调整网站结构,只需修改css目录中的css.css文件即可。 商城网站完全独立,网站源码随时可供您下载
PDDocument doc = PDDocument.load(inputStream);
// 1. 移除所有 JavaScript 动作(包括文档级、页面级、表单字段级)
doc.getDocumentCatalog().getAcroForm().getFields().forEach(field -> {
field.setActions(null); // 清空字段动作
});
doc.getDocumentCatalog().setOpenAction(null); // 清空 OpenAction
doc.getDocumentCatalog().setNames(null); // 清空名称树(常藏 JS 名称对象)
// 2. 删除所有非标准内容流中的 JavaScript 字符串(需遍历所有 COSObject)
COSDocument cosDoc = doc.getDocument();
cosDoc.getObjectPool().values().forEach(obj -> {
if (obj instanceof COSString) {
String str = ((COSString) obj).getString();
if (str.toLowerCase().contains("javascript:")) {
// 替换或标记为可疑(建议日志记录后丢弃)
}
}
});
// 3. 禁用富媒体:移除 EmbeddedFiles、RichMedia、Sound、Movie 等字典项
COSDictionary names = doc.getDocumentCatalog().getNames();
if (names != null) {
names.removeItem(COSName.EMBEDDED_FILES);
names.removeItem(COSName.RICHMEDIA);
}⚠️ 注意事项: 不要仅删除 /JS 或 /JavaScript 对象:攻击者常混淆命名(如 /J#61vaScript)或藏于压缩流中;应结合字符串扫描与语义解析。 保留结构完整性:避免直接删除 COS 对象导致 PDF 结构损坏;推荐使用 PDPageContentStream 重写内容流,或采用 DocBleach 的“白名单式重建”策略(只保留文本、图像、基础矢量指令)。 验证字体与 URI:检查 /URI 动作是否指向危险协议(javascript:、file://、data:),并统一替换为安全占位符。 设置严格权限:调用 doc.protect(new StandardProtectionPolicy("", "", permissions)) 并禁用 PERMISSION_FILL_IN, PERMISSION_JAVASCRIPT 等。
✅ 生产建议
- 将消毒逻辑封装为独立服务(如 Spring @Service),配合文件哈希校验与异步处理,避免阻塞上传响应;
- 对消毒后的 PDF 执行二次验证:用 pdfinfo(Poppler)或 PDFBox 的 PDFParser 检查是否仍含 /JavaScript、/Launch 等关键词;
- 建立“消毒日志”:记录文件名、原始大小、消毒后大小、移除的动作类型、触发告警的可疑特征,便于安全审计;
- 针对 DOCX/XLSX,可复用 DocBleach 的 OfficeSanitizer 模块,统一治理多格式风险。
综上,PDF 消毒不是“一刀切”的格式转换,而是基于语义理解的风险对象精准剔除。依托 PDFBox 的深度解析能力,辅以 DocBleach 经验证的策略,即可在不牺牲兼容性的前提下,显著降低 PDF 作为攻击载体的风险。
立即学习“Java免费学习笔记(深入)”;









