استكشاف أخطاء التشفير وأعلام الأذونات وإصلاحها
النطاق والحدود
قسم بعنوان «النطاق والحدود»استخدم هذه المداخل لاستكشاف إخفاقات فك التشفير التي يطلقها المحرك عبر NextPDF\Exception\EncryptionException وNextPDF\Security\Exception\DecryptionFailedException، ولفهم حدود أعلام أذونات تنسيق PDF.
ابدأ بالحدود لأنها تمنع أكثر المفاهيم الخاطئة شيوعًا: تسجّل أعلام أذونات PDF نية المؤلف في قاموس التشفير. ولا تُعدّ آلية تحكم في الوصول تفرضها هذه المكتبة. فبإمكان قارئ يتجاهل هذه الأعلام أن يطبع المحتوى أو ينسخه أو يعدّله رغم ذلك. تعامل مع الأعلام بوصفها طلبًا موجَّهًا إلى قارئ متعاون، لا بوصفها آلية إلزامية.
المُدخل: إخفاق عملية التشفير
قسم بعنوان «المُدخل: إخفاق عملية التشفير»- العَرَض.
EncryptionExceptionمع رسالة على الصيغةEncryption operation "<op>" failed using algorithm "<algorithm>". - السبب المحتمل. تعذّر تنفيذ عملية التشفير، عادةً لأن امتداد OpenSSL مفقود أو غير مُهيّأ على نحو صحيح، أو لأن مادة المفتاح غير صالحة، أو لأن حجم متجه التهيئة (IV) غير صالح عند حدود التشفير.
- الدليل / التشخيص. يُرجع
getContext()القيمتينalgorithmوoperation. وتكون قيمةoperationواحدة منencryptأوdecryptأوkey_derivation، بحيث يمكنك تحديد المرحلة التي أخفقت. - الحل.
- تأكد من أن امتداد OpenSSL في PHP مثبَّت ومُحمَّل.
- استخدم الحقل
operationلتحديد المرحلة التي أخفقت. - في حالة
key_derivation، تحقق من مدخلات كلمة المرور أو المفتاح. - أعد تنفيذ الاستدعاء.
- ذو صلة. مرجع الاستثناءات.
المُدخل: إخفاق فك التشفير لسبب بنيوي
قسم بعنوان «المُدخل: إخفاق فك التشفير لسبب بنيوي»- العَرَض.
DecryptionFailedExceptionمع رسالة على الصيغةDecryption failed for "<algorithm>": <reason>. - السبب المحتمل. تعذّرت معالجة النص المُشفَّر لسبب لا يتعلق بالعبث، مثل اقتطاع النص المُشفَّر، أو غياب متجه التهيئة (IV)، أو تمرير مفتاح خاطئ عند حدود واجهة برمجة التطبيقات (API). لم يُنفَّذ فحص السلامة لعدم توفر مادة كافية للتقييم.
- الدليل / التشخيص. يُرجع
getContext()القيمتينalgorithmوreason. يميّز توثيق المصدرDecryptionFailedExceptionعنTamperedDataException: يعني هذا الاستثناء خطأ في التهيئة أو النقل، لا عبثًا. لا تعامله بوصفه حادثًا أمنيًا في حد ذاته. - الحل.
- اقرأ
reasonلتحديد الخلل البنيوي، على سبيل المثالciphertext shorter than IV+tag. - تحقق من أن النص المُشفَّر نُقل دون اقتطاع.
- تأكد من أن المفتاح المُمرَّر عند الحدود هو المفتاح المستخدَم لتشفير المستند.
- أعد تنفيذ الاستدعاء.
- اقرأ
- ذو صلة. إخفاقات التوقيع والطابع الزمني.
المُدخل: إطلاق استثناء “بيانات تم العبث بها”
قسم بعنوان «المُدخل: إطلاق استثناء “بيانات تم العبث بها”»- العَرَض. تتلقّى
NextPDF\Security\Exception\TamperedDataExceptionبدلًا منDecryptionFailedException. - السبب المحتمل. جرى فحص السلامة لكنه أخفق. يختلف هذا عن إخفاق فك التشفير البنيوي: كانت هناك مادة كافية لتقييم السلامة، لكن التحقق من السلامة لم ينجح.
- الدليل / التشخيص. يميّز المصدر بين الصنفين:
DecryptionFailedExceptionبنيوي وليس حادثًا أمنيًا؛ بينما يشيرTamperedDataExceptionإلى فشل التحقق من المحتوى المُوثَّق. - الحل.
- تعامل مع المدخل بوصفه غير موثوق؛ لا تستهلك المحتوى المُفكَّك تشفيره.
- أعد جلب المستند من مصدر موثوق.
- إذا استمر الإخفاق مع مصدر معروف بسلامته، فاستخرج
getContext()لإعداد تقرير حادث.
- ذو صلة. إخفاقات التوقيع والطابع الزمني.
المُدخل: أعلام الأذونات لا تمنع إجراءً لاحقًا
قسم بعنوان «المُدخل: أعلام الأذونات لا تمنع إجراءً لاحقًا»- العَرَض. أُنتِج مستند بأعلام أذونات مضبوطة — على سبيل المثال، النسخ أو الطباعة غير مسموح بهما — ومع ذلك لا يزال قارئ ما ينسخ المحتوى أو يطبعه.
- السبب المحتمل. هذا حد متوقع، وليس عيبًا. قيمة الأذونات العددية المُمرَّرة إلى باني قاموس التشفير في Core لا تفرضها هذه المكتبة. الأعلام بيانات وصفية إرشادية؛ والقارئ الذي لا يحترمها لا يحجبه NextPDF.
- الدليل / التشخيص. يُصرّح
src/Security/Encryption/EncryptionDictionaryBuilder.phpبالدالةbuildDict(int $permissions, string $fileId)، ويوثّق المعامِل بأنهignored; retained for forward compatibility. تبدأ الدالة بـunset($permissions, $fileId). أعلام الأذونات التي يكشفهاsrc/Inspect/PdfPermissions.phpهي حقول فحص للقراءة فقط، وليست طبقة فرض. - الحل.
- لا تعتمد على أعلام الأذونات لإيقاف الطباعة أو النسخ أو التعديل. إذ لا تستطيع مكتبة تُنتج المستندات فرضها.
- عندما يلزم تقييد الوصول، تحكّم في توزيع الملف نفسه، أو طبّق نظام تحكم في الوصول خارج PDF.
- استخدم
PdfPermissionsللإبلاغ فقط عن الأعلام التي يصرّح بها مستند قائم، لا لتأكيد أن تلك الإجراءات ممنوعة.
- ذو صلة. إخفاقات التوقيع والطابع الزمني.
المُدخل: رفض التشفير في إطار PDF/A
قسم بعنوان «المُدخل: رفض التشفير في إطار PDF/A»- العَرَض.
NextPDF\Security\Exception\IncompatiblePdfAModeExceptionعندما يُفعِّل بناءٌ ما PDF/A ويطلب التشفير. - السبب المحتمل. يحظر ملف تعريف PDF/A مفتاح
Encryptفي المُذيَّل. يرفض المحرك هذا المزيج أيًا كان ترتيب الاستدعاءين. - الدليل / التشخيص. راجع مُدخل PDF/A وPDF/UA للاطلاع على البند المُستشهَد به، وحقول
getContext()، واختبار مسار الإخفاق. - الحل.
- قرّر ما إذا كان المستند يحتاج إلى مطابقة متطلبات الأرشفة أو إلى التشفير.
- أزل الاستدعاء الخاص بالخاصية التي لا تحتاج إليها.
- أعد تشغيل خط المعالجة.
- ذو صلة. التحقق من PDF/A وPDF/UA.
الحالات الحدّية والمزالق
قسم بعنوان «الحالات الحدّية والمزالق»DecryptionFailedExceptionوTamperedDataExceptionيعنيان أمرين مختلفين: إخفاق بنيوي مقابل إخفاق في السلامة. تفرّع بناءً على الصنف، لا على الرسالة.- يتجاهل باني قاموس التشفير في Core قيمة الأذونات العددية؛ وأي بناء يعتمد على فرض الأذونات من حزمة Core مبنيٌّ على مفهوم خاطئ.
- لا تُملأ بيانات
PdfPermissionsإلا للمستندات المشفَّرة عند عمق الفحص الكامل، وتعكس الأعلام المُصرَّح بها. ووجود حقل مملوء لا يعني أن الإجراء ممنوع.
انظر أيضًا
قسم بعنوان «انظر أيضًا»المسرد: أعلام الأذونات · فك التشفير المُوثَّق