تخطَّ إلى المحتوى
getnextpdf.com

Enterprise الإصدار

نزع تسليح المحتوى وإعادة بنائه (CDR)

يُحيِّد ⁨NextPDF Enterprise⁩ ملف ⁨PDF⁩ غير موثوق عبر نزع تسليح المحتوى وإعادة بنائه (⁨CDR⁩): إذ يحلّل الملف، ويفحصه مقابل حدود القبول، ويكتشف الميزات الخطرة، ويزيلها، ويعيد بناء ملف جديد من الكائنات الباقية. والميزات الخطرة هي محتوًى فعّال — نصوص برمجية مُضمَّنة، وإجراءات تشغيل، وملفات مُضمَّنة، ووسائط غنية، وما شابهها — قد يشغّله عارض أو يتصرّف بناءً عليه. وهذه الصفحة على مستوى السلوك: تذكر ما يقبله المحرّك، وما يجرّده، وما يعيد بناءه، ولماذا لا يكون المخرَج نسخة استدلالية.

‏⁨CDR⁩ تحويل تخريبي وحيد الاتجاه. والمخرَج المُعاد بناؤه إسقاط أمني للمُدخَل، لا نسخة محفوظة أو مكافئة بالتجزئة. ويُذكَر ذلك الحدّ تحت الأمان والامتثال.

المتطلبات المسبقة مذكورة في الواجهة الأمامية ومكرّرة تحت المتطلبات المسبقة.

تُشحَن هذه القدرة في ⁨NextPDF Enterprise⁩ (nextpdf/enterprise) وتُفعَّل بمظروف ترخيص من فئة ⁨Enterprise⁩. ولا يُحمِّل نشرٌ بلا ذلك الاستحقاق أصناف القدرة. ولا يوفّر ⁨NextPDF Core⁩ و⁨NextPDF Pro⁩ ⁨CDR⁩. ويعمل المحرّك داخل العملية؛ ويُحلَّل المستند غير الموثوق ويُعاد بناؤه على مضيفك. ‏قارِن الإصدارات واحصل على ترخيص.

يدعم ⁨PDF⁩ محتوًى فعّالًا قد يشغّله عارض أو يتصرّف بناءً عليه. ويسبّب إجراء ⁨ECMAScript⁩ تنفيذ مُعالِج ⁨PDF⁩ لنصٍّ برمجي قد يغيّر قيم الحقول والمظاهر، وفق ⁨ISO 32000-2 §12.6.4⁩. ويطلق إجراء التشغيل تطبيقًا أو يفتح مستندًا أو يطبعه، وفق ⁨ISO 32000-2 §12.6.4⁩. وتعمل النصوص البرمجية على مستوى المستند في قاموس الأسماء تلقائيًّا عند فتح المستند، وفق ⁨ISO 32000-2 §7.7.4⁩. ويزيل ⁨CDR⁩ هذه الأسطح.

يشغّل المحرّك مسارًا مُرتَّبًا:

  1. التحليل للملف ⁨PDF⁩ المُدخَل.
  2. ضبط القبول — التحقق من أن المستند ضمن حدّ القبول (عدد الكائنات، وعدد الصفحات، وحجم التدفّق بعد فكّ الضغط، ونسبة تضخّم تدفّق تدافع عن مدخلات قنبلة فكّ الضغط). ويُرفَض مستند خارج الحدود، لا يُطهَّر. ويُبلَّغ الرفض على نحو مميَّز عن نتيجة التطهير حتى تستطيع معالجتك للأخطاء التمييز بينهما.
  3. كشف التهديدات — مسح أنواع التهديدات المُعدَّة.
  4. الترشيح — تقسيم الكائنات إلى المجموعة الآمنة والمجموعة المُزالة.
  5. تنقية المراجع — تنظيف المؤشّرات المتدلّية التي خلّفتها الإزالة.
  6. إعادة البناء — تسلسلة الكائنات الآمنة إلى ملف ⁨PDF⁩ جديد.

تشمل أنواع التهديدات القابلة للكشف النصوص البرمجية المُضمَّنة (وتجريد النصوص العدواني الذي يلتقط النصوص في البُنى المُشوَّهة)، ومحفّزات الإجراءات الإضافية وإجراء الفتح، وإجراءات التشغيل، وإجراءات الانتقال البعيد، وإجراءات إرسال النماذج واستيراد البيانات، والملفات المُضمَّنة، والوسائط الغنية والمحتوى ثلاثي الأبعاد، وأشجار أسماء النصوص البرمجية على مستوى المستند، وإجراءات معرّف الموارد المُوحَّد (⁨URI⁩) الخارجية، وبيانات بنية نماذج ⁨XML⁩، وحقول النماذج التفاعلية، وطبقات المحتوى الاختيارية غير الافتراضية، وكائنات التوقيع الرقمي (التي تُبطِلها إعادة البناء بالضرورة لأن نطاقات البايتات لم تعد متطابقة). والكائن الذي يتعذّر تحليله يُعامَل بنفسه بوصفه تجاوزًا محتملًا ويُزال.

تضبط ثلاث سياسات الافتراضات:

  • ⁨Standard⁩ — تزيل أنواع تهديدات المحتوى الفعّال المُعدَّة والقابلة للكشف بالمحرّك؛ وتُسطَّح التحديثات التدريجية دائمًا للدفاع عن انتحال ظلّ التوقيع، وهذا التسطيح غير قابل للإعداد في هذا الوضع.
  • ⁨Paranoid⁩ — الإزالات نفسها مع حدود موارد أضيق.
  • ⁨Permissive⁩ — للمصادر الموثوقة: تزيل النصوص البرمجية وإجراءات التشغيل لكنها تحافظ على إجراءات ⁨URI⁩، وتجعل تسطيح التحديث التدريجي قابلًا للإعداد.

يعيد ⁨CDR⁩ بناء ملف جديد من الكائنات التي حكم بأنها آمنة، بدلًا من حذف المفاتيح الخطرة في مكانها. وموقف قائمة السماح هذا هو القرار الحامل. فالكائن الذي لم يتعرّف عليه الكاشف قط — بما في ذلك كائن تعذّر تحليله — لا يبقى في المخرَج، فتفشل البنية المجهولة فشلًا مغلقًا بدلًا من الانزلاق عبر ثغرة قائمة منع. ويعمل ضبط القبول أولًا للسبب نفسه: فالمُدخَل خارج الحدّ أو المتعذّر تحليله يُرفَض رفضًا صريحًا، ولا يُعاد بناؤه جزئيًّا أبدًا. وثمن تلك السلامة هو الحفظ. فإعادة البناء تغيّر تخطيط البايتات، وتُبطِل التوقيعات، وتُسقِط الحِمولات التي يُجرَّد نوع تهديدها — ولهذا يكون المخرَج إسقاطًا أمنيًّا، لا نسخة استدلالية أبدًا.

خلفية التصميم: تطهير ملفات ⁨PDF⁩ غير الموثوقة: نزع تسليح المحتوى وإعادة بنائه.

  1. ثبّت ⁨NextPDF Core⁩ وحزمة ⁨Enterprise⁩، واحتفظ بترخيص ⁨Enterprise⁩ فعّال.
  2. عرّف حدّ القبول لمدخلاتك — أقصى عدد كائنات، وعدد صفحات، وحجم تدفّق بعد فكّ الضغط، ونسبة تضخّم — أو استخدم حدود سياسة مُعدّة مسبقًا.
  3. قرّر السياسة: ⁨standard⁩ للقبول العام غير الموثوق، و⁨paranoid⁩ لأشدّ موقف، و⁨permissive⁩ للمصادر الموثوقة فقط.

السياسة غير قابلة للتغيير وتحمل:

  • أنواع التهديدات المراد إزالتها — المجموعة التي يمسحها الكاشف ويجرّدها مُعيد البناء.
  • معالجة إجراء ⁨URI⁩ — ما إذا كانت إجراءات ⁨URI⁩ الخارجية تُحفَظ.
  • تسطيح التحديث التدريجي — مُفعَّل دائمًا في ⁨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. شغّل عيّنة تحمل سطح محتوًى فعّال معروف (مثلًا نصًّا برمجيًّا على مستوى المستند) وأكّد ظهوره في قائمة التهديدات المُزالة وغيابه من المخرَج المُعاد بناؤه.
  2. شغّل مستندًا خارج الحدّ وأكّد أن النتيجة تبلّغ بعدم القبول مع سبب رفض، وأن البايتات المُعاد بناؤها فارغة.
  3. أكّد أن مُدخَلًا موقَّعًا رقميًّا قد أُزيلت كائنات توقيعه في إعادة البناء — تُبطِل إعادة البناء التوقيع الأصلي لأن نطاقات البايتات تتغيّر، فتُجرَّد كائنات التوقيع المتقادمة عمدًا.
  4. افتح المخرَج المُعاد بناؤه في عارض وأكّد عدم تنفيذ أي نص برمجي عند الفتح.
  • ليس للاستدلال. المخرَج المُعاد بناؤه إسقاط تخريبي غير قابل للعكس. لا تستخدمه لحفظ الأدلّة القانونية، أو لمقارنة التجزئة بالأصل، أو بوصفه نسخة أرشيفية. احتفظ بالأصل في عُهدة منفصلة إن احتجت إلى نسخة استدلالية.
  • القبول قبل التطهير. حدود الموارد حدّ قبول؛ ويُرفَض مستند خارج الحدّ، لا يُطهَّر. أبلِغ الرفض على نحو مميَّز حتى لا يُخلَط مُدخَل خارج الحدّ أبدًا بإعادة بناء نظيفة.
  • يُزال المحتوى الفعّال. تُجرَّد النصوص البرمجية وإجراءات التشغيل وأشجار أسماء النصوص البرمجية على مستوى المستند والملفات المُضمَّنة والوسائط الغنية وما شابهها — وهي ذات الإجراءات التي كان عارض سينفّذها (إجراء ⁨ECMAScript⁩ في ⁨ISO 32000-2 §12.6.4⁩؛ إجراء التشغيل؛ النصوص البرمجية على مستوى المستند في ⁨§7.7.4⁩).
  • تُبطِل إعادة البناء التوقيعات. لأن إعادة البناء تغيّر تخطيط البايتات، لم يعد التوقيع الأصلي قادرًا على التحقق؛ وتُزال كائنات التوقيع بدلًا من تركها في مكانها على نحو مُضلِّل.
  • مفقود للبيانات عمدًا. تُزال حِمولات الملفات المُضمَّنة — بما فيها مرفقات الفواتير مثل ⁨Factur-X⁩ — عند تجريد نوع تهديدها. و⁨CDR⁩ إسقاط أمني، لا طبقة حفظ.

تتعلّق هذه الصفحة بأمان المستندات. وكل مصدر معياري مُلخَّص؛ ولا يُعاد إنتاج أي نص معياري.

  • إخفاق التحليل. يُنتج مستند يتعذّر تحليله نتيجة بعدم القبول مع سبب خطأ تحليل بدلًا من إعادة بناء جزئية.
  • مُدخَل خارج الحدّ. تبلّغ النتيجة بعدم القبول مع سبب خاصّ بالحدّ؛ والبايتات المُعاد بناؤها فارغة.
  • كائن يتعذّر تحليله. يُعامَل الكائن الذي يتعذّر تحليله بوصفه تجاوزًا محتملًا ويُزال، لا يُبقى بصمت.
  • عدّ صفحات بأفضل جهد. فحص قبول عدّ الصفحات بأفضل جهد؛ ولا يُعطِّل فهرس مُشوَّه المسار، لكن حدود عدّ الكائنات والتدفّق تظل تنطبق.

توثّق هذه الصفحة السلوك القابل للملاحظة خارجيًّا وسطح ⁨API⁩ العام المدعوم فقط. أما مسارات فضاءات الأسماء الداخلية، وأصناف المساعِدة، وجداول الآليات، وأسماء ملفات كتيّبات التشغيل، وبادئات التذاكر فخارج النطاق.