ข้ามไปยังเนื้อหา
getnextpdf.com

Enterprise รุ่น

การลบล้างและสร้างเนื้อหาใหม่ (CDR)

NextPDF Enterprise ทำให้ PDF ที่ไม่น่าเชื่อถือเป็นกลางด้วย Content Disarm and Reconstruction (CDR) กล่าวคือ มันแยกวิเคราะห์ไฟล์ ตรวจสอบเทียบกับขีดจำกัดการรับเข้า ตรวจจับฟีเจอร์อันตราย ลบออก และสร้างไฟล์ใหม่จากออบเจกต์ที่เหลืออยู่ ฟีเจอร์อันตรายคือ active content เช่น สคริปต์ที่ฝัง launch action ไฟล์ที่ฝัง rich media และอื่น ๆ ที่โปรแกรมดูอาจเรียกใช้หรือดำเนินการตาม หน้านี้เป็นระดับพฤติกรรม ระบุว่าเอนจินรับเข้าอะไร กำจัดอะไร สร้างอะไรขึ้นใหม่ และเหตุใดเอาต์พุตจึงไม่ใช่สำเนาเชิงหลักฐาน

CDR เป็นการแปลงแบบทำลายและทางเดียว เอาต์พุตที่สร้างใหม่เป็นการฉายภาพด้านความปลอดภัยของอินพุต ไม่ใช่สำเนาที่ถูกคงสภาพไว้หรือเทียบเท่าด้วยแฮช ขอบเขตนั้นระบุไว้ภายใต้ ความปลอดภัยและการปฏิบัติตามข้อกำหนด

ข้อกำหนดเบื้องต้นระบุไว้ใน front matter และทำซ้ำไว้ภายใต้ ข้อกำหนดเบื้องต้น

ความสามารถนี้มาใน NextPDF Enterprise (nextpdf/enterprise) และเปิดใช้งานด้วยซองสิทธิ์ใช้งานระดับ Enterprise การนำไปใช้งานที่ไม่มีสิทธิ์นั้นจะไม่โหลดคลาสของความสามารถนี้ NextPDF Core และ NextPDF Pro ไม่ได้มอบ CDR เอนจินทำงานภายในกระบวนการ เอกสารที่ไม่น่าเชื่อถือถูกแยกวิเคราะห์และสร้างขึ้นใหม่บนโฮสต์ของคุณ เปรียบเทียบรุ่นและรับสิทธิ์ใช้งาน

PDF รองรับ active content ที่โปรแกรมดูสามารถเรียกใช้หรือดำเนินการตามได้ ECMAScript action ทำให้ตัวประมวลผล PDF เรียกใช้สคริปต์ที่สามารถเปลี่ยนค่าฟิลด์และลักษณะที่ปรากฏ ตาม ISO 32000-2 §12.6.4 launch action เปิดแอปพลิเคชันหรือเปิดหรือพิมพ์เอกสาร ตาม ISO 32000-2 §12.6.4 สคริปต์ระดับเอกสารใน name dictionary ทำงานอัตโนมัติเมื่อเปิดเอกสาร ตาม ISO 32000-2 §7.7.4 CDR ลบพื้นผิวเหล่านี้ออก

เอนจินรันไปป์ไลน์ที่มีลำดับ:

  1. แยกวิเคราะห์ PDF ที่เป็นอินพุต
  2. การควบคุมการรับเข้า — ตรวจสอบว่าเอกสารอยู่ภายในขอบเขตการยอมรับ (จำนวนออบเจกต์ จำนวนหน้า ขนาดสตรีมที่ถอดรหัสแล้ว และอัตราการขยายสตรีมที่ป้องกันอินพุตแบบ decompression-bomb) เอกสารที่อยู่นอกขีดจำกัดจะถูกปฏิเสธ ไม่ใช่ทำให้สะอาด การปฏิเสธถูกรายงานแยกจากผลการทำให้สะอาด การจัดการข้อผิดพลาดของคุณจึงแยกทั้งสองออกจากกันได้
  3. ตรวจจับภัยคุกคาม — สแกนหาชนิดภัยคุกคามที่กำหนดค่าไว้
  4. กรอง — แบ่งออบเจกต์ออกเป็นชุดที่ปลอดภัยและชุดที่ถูกลบ
  5. ขัดล้างการอ้างอิง — ทำความสะอาดพอยน์เตอร์ที่ถูกทิ้งให้ลอยจากการลบ
  6. สร้างใหม่ — ซีเรียลไลซ์ออบเจกต์ที่ปลอดภัยเข้าเป็น PDF ใหม่

ชนิดภัยคุกคามที่ตรวจจับได้รวมถึงสคริปต์ที่ฝัง (และการกำจัดสคริปต์เชิงรุกที่จับสคริปต์ในโครงสร้างที่ผิดรูป) ทริกเกอร์ additional-actions และ open-action launch action remote go-to action การส่งฟอร์มและ import-data action ไฟล์ที่ฝัง rich media และเนื้อหาสามมิติ name tree ของสคริปต์ระดับเอกสาร action ของ Uniform Resource Identifier (URI) ภายนอก ข้อมูล XML Forms Architecture ฟิลด์ฟอร์มแบบโต้ตอบ เลเยอร์เนื้อหาเสริมที่ไม่ใช่ค่าเริ่มต้น และออบเจกต์ลายเซ็นดิจิทัล (ซึ่งการสร้างใหม่จำเป็นต้องทำให้ไม่ถูกต้องเพราะช่วงไบต์ไม่ตรงกันอีกต่อไป) ออบเจกต์ที่แยกวิเคราะห์ไม่ได้จะถูกถือว่าเป็นการเลี่ยงผ่านที่อาจเกิดขึ้นและถูกลบออก

สามนโยบายตั้งค่าเริ่มต้น:

  • Standard — ลบชนิดภัยคุกคาม active content ที่กำหนดค่าไว้ซึ่งเอนจินตรวจจับได้ การอัปเดตแบบเพิ่มจะถูกแบนราบเสมอเพื่อป้องกันการ shadowing ลายเซ็น และการแบนราบนั้นกำหนดค่าไม่ได้ในโหมดนี้
  • Paranoid — การลบแบบเดียวกันพร้อมขีดจำกัดทรัพยากรที่เข้มงวดขึ้น
  • Permissive — สำหรับแหล่งที่เชื่อถือได้ ลบสคริปต์และ launch action แต่คงไว้ซึ่ง URI action และทำให้การแบนราบการอัปเดตแบบเพิ่มกำหนดค่าได้

CDR สร้างไฟล์ใหม่จากออบเจกต์ที่มันตัดสินว่าปลอดภัย แทนที่จะลบคีย์อันตรายในตำแหน่งเดิม จุดยืนแบบ allow-list นั้นคือการตัดสินใจที่เป็นแกนหลัก ออบเจกต์ที่ตัวตรวจจับไม่เคยรู้จัก — รวมถึงออบเจกต์ที่มันแยกวิเคราะห์ไม่ได้ — จะไม่รอดเข้าไปในเอาต์พุต ดังนั้นโครงสร้างที่ไม่รู้จักจึงล้มเหลวแบบปิด แทนที่จะลอดผ่านช่องโหว่ของ deny-list การควบคุมการรับเข้าทำงานก่อนด้วยเหตุผลเดียวกัน อินพุตที่เกินขีดจำกัดหรือแยกวิเคราะห์ไม่ได้จะถูกปฏิเสธทันที ไม่มีการสร้างใหม่บางส่วน ต้นทุนของความปลอดภัยนั้นคือการคงสภาพ การสร้างใหม่เปลี่ยนเค้าโครงไบต์ ทำให้ลายเซ็นไม่ถูกต้อง และทิ้งเพย์โหลดที่ชนิดภัยคุกคามถูกกำจัด — ซึ่งเป็นเหตุผลว่าทำไมเอาต์พุตจึงเป็นการฉายภาพด้านความปลอดภัย ไม่ใช่สำเนาเชิงหลักฐาน

ภูมิหลังการออกแบบ: Sanitizing untrusted PDFs: content disarm and reconstruction

  1. ติดตั้ง NextPDF Core และแพ็กเกจ Enterprise และถือสิทธิ์ใช้งาน Enterprise ที่ใช้งานอยู่
  2. กำหนดขอบเขตการยอมรับสำหรับอินพุตของคุณ — จำนวนออบเจกต์สูงสุด จำนวนหน้า ขนาดสตรีมที่ถอดรหัสแล้ว และอัตราการขยาย — หรือใช้ขีดจำกัดของนโยบายสำเร็จรูป
  3. ตัดสินใจเลือกนโยบาย ได้แก่ standard สำหรับการรับเข้าที่ไม่น่าเชื่อถือทั่วไป paranoid สำหรับจุดยืนที่เข้มงวดที่สุด หรือ permissive เฉพาะสำหรับแหล่งที่เชื่อถือได้

นโยบายไม่เปลี่ยนรูปและพกพา:

  • ชนิดภัยคุกคามที่จะลบ — ชุดที่ตัวตรวจจับสแกนหาและตัวสร้างใหม่กำจัด
  • การจัดการ URI action — ว่า URI action ภายนอกจะถูกคงไว้หรือไม่
  • การแบนราบการอัปเดตแบบเพิ่ม — เปิดเสมอใน standard และ paranoid กำหนดค่าได้ใน permissive
  • ขีดจำกัดการรับเข้า — จำนวนออบเจกต์สูงสุด จำนวนหน้า ขนาดสตรีมที่ถอดรหัสแล้ว และอัตราการขยาย เหล่านี้คือขอบเขตการยอมรับ ไม่ใช่พฤติกรรมการทำให้สะอาด การเกินขีดจำกัดเหล่านี้จะปฏิเสธเอกสาร
  1. อ่านไบต์ PDF ที่ไม่น่าเชื่อถือ
  2. เลือกนโยบาย (standard, paranoid หรือ permissive) หรือสร้างขึ้นด้วยขีดจำกัดที่ชัดแจ้ง
  3. รันการดำเนินการทำให้สะอาดของเอนจินด้วยไบต์และนโยบาย
  4. ตรวจสอบผล หากรายงานว่าไม่ได้รับเข้า ให้แสดงเหตุผลการปฏิเสธ มิฉะนั้นใช้ไบต์ที่สร้างใหม่และรายการภัยคุกคามที่ถูกลบ
  5. ถือว่าเอาต์พุตที่สร้างใหม่เป็นการฉายภาพที่ทำให้สะอาดแล้ว ไม่ใช่สำเนาเชิงหลักฐานหรือสำเนาเพื่อการเก็บถาวรของอินพุต
examples/enterprise/cdr-sanitize-guarded.php
<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use NextPDF\Enterprise\Security\Cdr\CdrEngine;
use NextPDF\Enterprise\Security\Cdr\CdrPolicy;
use NextPDF\Enterprise\Security\Cdr\CdrResult;
use Psr\Log\LoggerInterface;
final readonly class UntrustedPdfIntake
{
public function __construct(
private CdrEngine $engine,
private LoggerInterface $logger,
) {}
/**
* Sanitize an untrusted PDF and distinguish rejection from a clean rebuild.
*
* An over-limit document is rejected by admission control, not sanitized;
* the caller surfaces the rejection reason instead of trusting an empty
* output. The rebuilt bytes are a security projection, never an
* evidentiary copy of the input.
*
* @param string $pdfBytes The untrusted PDF bytes.
*
* @return CdrResult The sanitization result, including admission status.
*/
public function sanitize(string $pdfBytes): CdrResult
{
$result = $this->engine->sanitize($pdfBytes, CdrPolicy::standard());
if (! $result->admitted) {
$this->logger->warning('PDF rejected by CDR admission control', [
'reason' => $result->rejectionReason,
]);
return $result;
}
$this->logger->info('PDF sanitized', [
'removedThreats' => \count($result->removedThreats),
'originalSize' => $result->originalSize,
'sanitizedSize' => $result->sanitizedSize,
]);
return $result;
}
}
  1. รันตัวอย่างที่พกพาพื้นผิว active content ที่รู้จัก (เช่น สคริปต์ระดับเอกสาร) และยืนยันว่ามันปรากฏในรายการภัยคุกคามที่ถูกลบและไม่มีอยู่ในเอาต์พุตที่สร้างใหม่
  2. รันเอกสารที่เกินขีดจำกัดและยืนยันว่าผลรายงานว่าไม่ได้รับเข้าพร้อมเหตุผลการปฏิเสธ และไบต์ที่สร้างใหม่ว่างเปล่า
  3. ยืนยันว่าอินพุตที่ลงนามดิจิทัลมีออบเจกต์ลายเซ็นถูกลบในการสร้างใหม่ — การสร้างใหม่ทำให้ลายเซ็นเดิมไม่ถูกต้องเพราะช่วงไบต์เปลี่ยนไป ออบเจกต์ลายเซ็นที่ล้าสมัยจึงถูกกำจัดโดยการออกแบบ
  4. เปิดเอาต์พุตที่สร้างใหม่ในโปรแกรมดูและยืนยันว่าไม่มีสคริปต์ทำงานเมื่อเปิด
  • ไม่ใช่สำหรับหลักฐาน เอาต์พุตที่สร้างใหม่เป็นการฉายภาพแบบทำลายและย้อนกลับไม่ได้ อย่าใช้สำหรับการคงสภาพหลักฐานทางกฎหมาย สำหรับการเทียบแฮชกับต้นฉบับ หรือเป็นสำเนาเพื่อการเก็บถาวร ให้เก็บต้นฉบับไว้ในการดูแลแยกต่างหากหากคุณต้องการสำเนาเชิงหลักฐาน
  • การรับเข้าก่อนการทำให้สะอาด ขีดจำกัดทรัพยากรเป็นขอบเขตการยอมรับ เอกสารที่เกินขีดจำกัดจะถูกปฏิเสธ ไม่ใช่ทำให้สะอาด ให้รายงานการปฏิเสธแยกต่างหากเพื่อไม่ให้อินพุตที่เกินขีดจำกัดถูกเข้าใจผิดว่าเป็นการสร้างใหม่ที่สะอาด
  • active content ถูกลบ สคริปต์ launch action name tree ของสคริปต์ระดับเอกสาร ไฟล์ที่ฝัง rich media และพื้นผิวที่คล้ายกันถูกกำจัด — action เหล่านั้นเองที่โปรแกรมดูจะเรียกใช้มิฉะนั้น (ISO 32000-2 §12.6.4 ECMAScript action; launch action; สคริปต์ระดับเอกสาร §7.7.4)
  • ลายเซ็นถูกทำให้ไม่ถูกต้องด้วยการสร้างใหม่ เพราะการสร้างใหม่เปลี่ยนเค้าโครงไบต์ ลายเซ็นเดิมจึงไม่สามารถผ่านการตรวจสอบได้อีก ออบเจกต์ลายเซ็นถูกลบออกแทนที่จะถูกทิ้งไว้อย่างทำให้เข้าใจผิด
  • สูญเสียข้อมูลโดยการออกแบบ เพย์โหลดไฟล์ที่ฝัง — รวมถึงไฟล์แนบใบแจ้งหนี้เช่น Factur-X — ถูกลบเมื่อชนิดภัยคุกคามของมันถูกกำจัด CDR เป็นการฉายภาพด้านความปลอดภัย ไม่ใช่เลเยอร์การคงสภาพ

หน้านี้เกี่ยวข้องกับความปลอดภัยของเอกสาร แหล่งอ้างอิงเชิงบรรทัดฐานทุกแหล่งถูกถอดความ ไม่มีการนำข้อความเชิงบรรทัดฐานมาแสดงซ้ำ

  • ความล้มเหลวในการแยกวิเคราะห์ เอกสารที่แยกวิเคราะห์ไม่ได้จะให้ผลแบบไม่ได้รับเข้าพร้อมเหตุผล parse-error แทนการสร้างใหม่บางส่วน
  • อินพุตที่เกินขีดจำกัด ผลรายงานว่าไม่ได้รับเข้าพร้อมเหตุผลเฉพาะขีดจำกัด ไบต์ที่สร้างใหม่ว่างเปล่า
  • ออบเจกต์ที่แยกวิเคราะห์ไม่ได้ ออบเจกต์ที่แยกวิเคราะห์ไม่ได้จะถูกถือว่าเป็นการเลี่ยงผ่านที่อาจเกิดขึ้นและถูกลบออก ไม่ใช่เก็บไว้เงียบ ๆ
  • การนับหน้าแบบ best-effort การตรวจสอบการรับเข้าด้วยการนับหน้าเป็นแบบ best-effort แค็ตตาล็อกที่ผิดรูปไม่ทำให้ไปป์ไลน์ล่ม แต่ขีดจำกัดจำนวนออบเจกต์และสตรีมยังคงมีผล

หน้านี้บันทึกเฉพาะพฤติกรรมที่สังเกตได้จากภายนอกและพื้นผิว API สาธารณะที่รองรับเท่านั้น เส้นทาง namespace ภายใน คลาสตัวช่วย ตารางกลไก ชื่อไฟล์ runbook และคำนำหน้า ticket อยู่นอกขอบเขต