跳轉到

內容消毒與重建(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(移除)

延伸閱讀