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

نموذج تهديدات المحرّك

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

الحدّ. يسجّل نموذج التهديدات التهديدات المأخوذة في الحسبان والتخفيفات المطبَّقة عليها. وهو لا يدّعي انعدام الثغرات. والفئة غير المدرجة هنا لا يعني ذلك ثبوت انعدامها؛ فقد تقع خارج النطاق الحالي للنموذج. وقبل إطلاق الميزات غير المنفَّذة، يجب أن تمرّ عبر مراجعة تهديدات رسمية. عامِل هذه الصفحة بوصفها سجلًا لتصميم متعمَّد، لا بوصفها برهانًا أمنيًا.

Terminal window
composer require nextpdf/core:^3

آليات الحراسة الموصوفة هنا جزء من الحزمة الأساسية. ولا تحتاج إلى اعتمادية إضافية لتفعيلها؛ فهي مفعَّلة افتراضيًا.

يتّبع النموذج عملية نمذجة التهديدات الخاصة بمشروع أمن التطبيقات العالمي المفتوح (⁨OWASP⁩) ‏(owasp_threat_modeling#x1.x11.p6): تفكيك النظام عند النقاط التي تعبر فيها المدخلات غير الموثوقة حدًّا من حدود الثقة، وتعداد التهديدات عند كل حدّ، وتسجيل وسائل التخفيف.

حدّ الثقة الأساسي للمحرك هو استيعاب المستندات: أيّ موضع يكون فيه محتوى مؤلَّف في مكان آخر — صفحة أنماط بعيدة، أو مصدر @font-face، أو <image href>، أو فاتورة لغة الترميز الموسَّعة (⁨XML⁩) مضمَّنة، أو ملف ⁨PDF⁩ لفحصه — قادرًا على دفع المحرك إلى جلب البيانات أو تحليلها أو فك ضغطها. المبدأ الحاكم هو المنع افتراضيًا: كل قدرة من قدرات الموارد الخارجية معطَّلة إلى أن تمكّنها صراحةً عبر كائن سياسة. يطبّق هذا خطّ الأساس الخاص بأقل قدر من الوظائف من المعهد الوطني للمعايير والتقنية (⁨NIST⁩) ⁨SP 800-53 Rev. 5 CM-7⁩ ‏(nist_sp_800_53r5#x4.x182.p14) على محرك عرض: الإعداد الافتراضي للباني هو الوضع الأكثر تشدّدًا. وفتح أيّ قدرة هو قرارك الصريح.

نموذج التهديدات ليس واجهة برمجة تطبيقات (⁨API⁩). وكائنات السياسة التي تعبّر عنه موثَّقة في صفحات الوحدات. نقاط الدخول ذات الصلة بالثقة هي عقد سياسة الموارد الخارجية (ExternalResourcePolicyInterface، مع DefaultExternalResourcePolicy بوصفه الإعداد الافتراضي للمنع الكامل) وحارسا محدِّد الموارد الموحَّد (⁨URL⁩) و⁨XML⁩‏ (UrlValidator، XmlGuard). تشير هذه الصفحة إلى سلوكها، ولا تعيد توثيق توقيعاتها.

الوضع الآمن هو الافتراضي. ولا تحتاج إلى شِفرة للحصول عليه:

<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Html\DefaultExternalResourcePolicy;
// Out of the box: @font-face blocked, @import blocked, background-image
// blocked, SVG external refs blocked. A document that tries to fetch a
// remote resource gets a system-font fallback or an ignored rule — not an
// outbound request.
$policy = new DefaultExternalResourcePolicy();

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

<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Html\DefaultExternalResourcePolicy;
// Explicit, scoped opt-in. The HTTPS scheme is required; size and glyph
// caps still apply; the URL still passes the SSRF guard before any fetch.
$policy = (new DefaultExternalResourcePolicy())
->withFontFaceAllowed(['https']);
  • غير المنفَّذ ليس مرادفًا للآمن بالمصادفة. قدرات مثل background-image url() في ⁨CSS⁩ غير منفَّذة، لذا لا تملك سطح هجوم حاليًا. ومع ذلك فهي موثَّقة بوصفها تتطلّب بوابة تهديدات رسمية قبل أيّ تنفيذ مستقبلي. غياب الشِّفرة هو وسيلة التخفيف اليوم، لا ضمان دائم.
  • إعادة ربط نظام أسماء النطاقات (⁨DNS⁩) هدف متحرّك. يحلّ UrlValidator اسم المضيف ويعيد عنوان بروتوكول الإنترنت (⁨IP⁩) المُحلَّل كي يتمكّن المُستدعي من تثبيت الاتصال (⁨CURLOPT_RESOLVE⁩)، فيغلق نافذة وقت‑الفحص إلى وقت‑الاستخدام (⁨TOCTOU⁩) بين التحقّق والجلب. هذا دفاع وفق أفضل جهد، لا دفاع مطلق. والمشغّل الذي يقف خلف وكيل خروج متساهل لا يزال بإمكانه الوصول إلى مضيفين داخليين لا تستطيع المكتبة رؤيتهم.
  • بتات الأذونات ليست تحكّمًا في الوصول. المستند الذي “يمنع النسخ” يعتمد على تعاون القارئ، لا على الإنفاذ. يتناول نموذج الأمان ذلك. ويُنوَّه به هنا لأنّه مفهوم خاطئ شائع في نمذجة التهديدات.

يفشل الحراس بسرعة ويحدّون مقدار العمل: يرفض حارس ⁨XML⁩ إعلان نوع المستند (⁨DOCTYPE⁩) قبل التحليل ويضع حدًّا أقصى لحجم المدخلات؛ ويفرض مسار الصورة سقفًا بالميغابكسل وسقفًا بالبايت قبل فك الضغط؛ ويرفض حارس ⁨URL⁩ وفقًا للمخطّط والمضيف قبل فتح أيّ مقبس. الإعداد الافتراضي الآمن يكلّف طلبًا مرفوضًا، لا طلبًا بطيئًا.

فيما يلي فئات الهجوم المأخوذة في الحسبان وتخفيفاتها داخل الشِّفرة، مع مراجع تعداد نقاط الضعف الشائعة (⁨CWE⁩) و⁨OWASP⁩ حيثما تنطبق:

فئة التهديد (⁨CWE⁩ / ⁨OWASP⁩)المتجه في محرك ⁨PDF⁩الحارس داخل الشِّفرة
تزوير الطلبات من جانب الخادم (⁨SSRF⁩) (⁨OWASP Top 10 2025⁩؛ owasp_top10_2025#x3.x1.p26)@font-face/@import/url() يشير إلى 169.254.169.254 أو مضيف داخلي؛ جالبات سلطة الطابع الزمني (⁨TSA⁩)، وبروتوكول حالة الشهادة عبر الإنترنت (⁨OCSP⁩)، وقائمة إبطال الشهادات (⁨CRL⁩)UrlValidator::validateExternalUrl() يحجب النطاقات الخاصة والمحجوزة والاسترجاعية والمحلية‑الوصلة ونقاط نهاية بيانات السحابة الوصفية؛ ويرفض المخطّطات الخطرة؛ ويحلّ ⁨DNS⁩؛ ويعيد عنوان ⁨IP⁩ لتثبيت الاتصال
الكيان الخارجي في ⁨XML⁩‏ (⁨XXE⁩) (cwe_top25_2025#x28.x2.p42)كيانات خارجية أو ⁨DOCTYPE⁩ في فاتورة ⁨XML⁩ مضمَّنة أو حزمة منصّة البيانات الوصفية الموسَّعة (⁨XMP⁩)XmlGuard::loadXml() يفرض LIBXML_NONET، ويرفض أيّ إعلان ⁨DOCTYPE⁩ رفضًا قاطعًا، ويرفض محارف التحكّم المحظورة في ⁨XML 1.0⁩، ويطبّق حدًّا أقصى لحجم المدخلات
قنبلة فك الضغطصورة 1×1 تُخفي حمولة 100 ⁨MP⁩؛ ملف ⁨Web Open Font Format 2⁩ (⁨WOFF2⁩) مُفرط الحجميفرض مسار الصورة سقفًا بالميغابكسل وحدًّا أقصى بالبايت قبل فك الضغط؛ ويضع مسار الخط حدًّا أقصى لحجم الملف وعدد المحارف الرسومية
اجتياز المساراتfile:///etc/passwd عبر src في خط أو ⁨SVG⁩الموارد الخارجية ممنوعة كليًا افتراضيًا؛ ومسارات الملفات المحلية تُحلّ عبر realpath() مقابل قائمة سماح للدلائل عند تمكينها صراحةً
حقن المحتوىسلسلة مصاغة بعناية تنفلت من معامل ⁨PDF⁩؛ ‏data:/javascript: في ⁨href⁩تهريب سلاسل ⁨PDF⁩ عند الإصدار؛ قائمة سماح للمخطّطات وتطهير ⁨href⁩ في التعليقات التوضيحية

تجتمع الإعدادات الافتراضية لتشكّل وضع منع كامل للموارد الخارجية: تبقى الخطوط، و@import، وصورة الخلفية، والمراجع الخارجية في ⁨SVG⁩ معطَّلة إلى أن تختار تفعيلها لكل مخطّط، كما هو موضّح في مصفوفة تغطية الخصائص الأمنية المصانة جنبًا إلى جنب مع الشِّفرة.

توثّق هذه الصفحة التهديدات المأخوذة في الحسبان. وهي ليست تقرير اختبار اختراق، ولا تدّعي أنّ التخفيفات المدرجة كاملة أو أنّه لا تنطبق أيّ فئة ضعف أخرى.

هذا ليس ملفًا تعريفيًا للمطابقة. يسترشد نموذج التهديدات بعملية نمذجة التهديدات الخاصة بـ ⁨OWASP⁩ وتصنيف نقاط الضعف ⁨CWE Top 25⁩ ‏(cwe_top25_2025#x28.x2.p42)؛ وهو لا يدّعي المطابقة لأيّ مخطّط لشهادات الأمن. يندرج التقييم المستقل ضمن تدقيق، لا ضمن هذا المستند.