我构建了一个安全扫描器,在你发送 PDF 前审计它们。以下是实现过程。[Devlog #10]
发布: (2026年4月24日 GMT+8 09:30)
3 分钟阅读
原文: Dev.to
Source: Dev.to
概览
您即将通过电子邮件发送一份合同。表面上看它很干净,但仍可能包含隐藏的元数据,例如您的姓名、机器的主机名、原作者的公司以及创建时间戳。收件人可以看到所有这些信息。
Audit Report 会在您点击发送之前扫描每个 PDF,捕获这些泄漏。
扫描器检查的内容
- 元数据泄漏 – 作者、创建者、生成器、时间戳
- 隐藏文本层 – 在普通缩放下不可见的内容
- 嵌入的脚本或表单操作
- 不符合标准的对象,这些对象不应出现在干净的文档中
- 未正确删除的已编辑内容(像素级检查)
示例结果结构(Rust)
pub struct AuditResult {
pub metadata_warnings: Vec,
pub hidden_content: Vec,
pub suspicious_objects: Vec,
pub risk_level: RiskLevel,
}
核心审计函数
pub fn audit_pdf(doc: &Document) -> AuditResult {
let mut result = AuditResult::default();
// 1. Check Info dictionary
if let Ok(info) = doc.get_info() {
for key in &["Author", "Creator", "Producer"] {
if info.get(*key).is_some() {
result.metadata_warnings.push(format!("{} field present", key));
}
}
}
// 2. Walk all objects for suspicious content
for (id, object) in &doc.objects {
if let Ok(stream) = object.as_stream() {
if contains_hidden_text(stream) {
result.hidden_content.push(HiddenLayer { id: *id });
}
}
}
result.risk_level = compute_risk(&result);
result
}
审计结果会以格式化的 PDF 报告形式写出,完全离线生成且不依赖外部库。报告包括:
- 一个绿色摘要,指示整体安全性
- 检查项目的详细列表以及任何警告
为什么重要
大多数人只检查 PDF 的可见内容。没有人会检查不可见的内容——而这款工具正是专门做这件事的。
获取工具
Hiyoko PDF Vault – 扫描器的即用版:
https://hiyokoko.gumroad.com/l/HiyokoPDFVault
在 Twitter 上关注作者: @hiyoyok