內容消毒與重建(CDR)¶
Content Disarm and Reconstruction(CDR)是一種主動防禦技術:不依賴惡意軟體特徵碼偵測,而是假設所有 PDF 均可能含有威脅,系統性地移除所有可執行、可觸發的內容,僅保留文件的純資訊層。
NextPDF Enterprise 的 CDR 引擎在 PDF 物件樹層級操作,逐一解析並消除潛在威脅向量,然後從乾淨的元素重建文件。
威脅向量覆蓋¶
| 威脅類型 | PDF 物件 | 消毒動作 |
|---|---|---|
| 嵌入可執行檔 | /EmbeddedFile | 完整移除附件及 /EmbeddedFiles 名稱樹 |
| JavaScript 程式碼 | /JS, /JavaScript | 移除所有 JS 動作、OpenAction、AA 觸發器 |
| Flash / SWF | /RichMedia, /EmbeddedFile | 移除 RichMedia 標注及關聯資源 |
| 啟動動作 | /Launch | 移除所有 Launch 動作(可開啟外部程式) |
| URI 動作 | /URI | 依政策:移除或列入允許清單驗證 |
| 提交表單動作 | /SubmitForm | 依政策處理(金融機構通常全部移除) |
| OLE 物件 | Embedded OLE | 移除 OLE 包裝器,保留可見內容 |
| ActiveX 控制項 | /Widget 特殊型態 | 移除非標準 Widget 標注 |
| 自動開啟動作 | /OpenAction | 移除自動觸發動作 |
| 3D 內容(非 PDF/A-4e) | /3D | 依政策移除或保留 |
| 隱藏圖層 | /OCG | 強制展開所有圖層,移除隱藏內容 |
| 壓縮物件流 | /ObjStm | 解壓縮後逐一審查再重新壓縮 |
核心 API¶
CdrEngine¶
use NextPDF\Enterprise\Security\Cdr\CdrEngine;
use NextPDF\Enterprise\Security\Cdr\CdrPolicy;
use NextPDF\Enterprise\Security\Cdr\SanitizationReport;
$policy = CdrPolicy::create()
->removeEmbeddedFiles()
->removeJavaScript()
->removeFlashContent()
->removeLaunchActions()
->removeOleObjects()
->removeActiveXControls()
->removeAutoOpenActions()
->removeHiddenLayers(flatten: true) // 展平後保留可見內容
->handleUriActions(UriAction::AllowlistOnly, allowlist: $trustedDomains)
->handleSubmitFormActions(SubmitFormPolicy::RemoveAll);
$engine = new CdrEngine($policy);
$result = $engine->sanitize($untrustedPdfBytes);
// 存取消毒後文件
$cleanPdf = $result->sanitizedDocument();
// 稽核報告
$report = $result->report();
echo $report->threatsFound(); // 發現威脅數量
echo $report->threatsRemoved(); // 已移除數量
foreach ($report->entries() as $entry) {
// $entry->threatType(), $entry->objectRef(), $entry->action()
}
PHP Compatibility
This example uses PHP 8.5 syntax. If your environment runs PHP 8.1 or 7.4, use NextPDF Backport for a backward-compatible build.
CdrPolicy¶
use NextPDF\Enterprise\Security\Cdr\CdrPolicy;
// 預設安全政策(推薦金融/醫療場景)
$policy = CdrPolicy::strictFinancial(); // 移除所有動態內容
$policy = CdrPolicy::strictHealthcare(); // 符合 HIPAA CDR 建議
$policy = CdrPolicy::government(); // 符合 NCSC CDR 指引
// 自定義政策
$policy = CdrPolicy::create()
->removeEmbeddedFiles(keepAllowlisted: true, allowlist: ['invoice.xml'])
->removeJavaScript()
// ...更多設定
->withAuditLog(enabled: true, logLevel: LogLevel::Detailed);
SanitizationReport¶
CDR 操作產生的不可變稽核報告:
use NextPDF\Enterprise\Security\Cdr\SanitizationReport;
$report = $result->report();
// 報告匯出為 JSON(適合 SIEM 整合)
$json = $report->toJson();
// 報告摘要
echo $report->documentId();
echo $report->processedAt()->format('c');
echo $report->originalSizeBytes();
echo $report->sanitizedSizeBytes();
echo $report->threatsFound();
echo $report->processingDurationMs();
// 威脅明細
foreach ($report->threats() as $threat) {
echo sprintf(
'[%s] %s at obj %s — %s',
$threat->severity()->name, // CRITICAL | HIGH | MEDIUM | LOW
$threat->type()->name,
$threat->objectRef(),
$threat->action()->name, // REMOVED | NEUTRALIZED | FLAGGED
);
}
批次消毒¶
use NextPDF\Enterprise\Security\Cdr\CdrBatchProcessor;
$processor = new CdrBatchProcessor(
engine: $engine,
concurrency: 8,
onThreatDetected: function (SanitizationReport $report): void {
$alertService->notify(
severity: $report->highestSeverity(),
documentId: $report->documentId(),
threatCount: $report->threatsFound(),
);
},
);
$results = $processor->processBatch($untrustedPdfCollection);
$summary = $results->summary();
echo $summary->totalProcessed(); // 總處理數
echo $summary->threatsDetected(); // 含威脅文件數
echo $summary->cleanDocuments(); // 乾淨文件數
效能規格¶
| 場景 | 指標 |
|---|---|
| 單頁 PDF 消毒 | |
| 50 頁 PDF 消毒 | |
| 批次消毒吞吐量(並發 8) | |
| 含嵌入 Flash 的 PDF(移除) |