تحسين الأمان في الإصدار Manifest V3
هذا هو القسم الأخير من ثلاثة أقسام تصف التغييرات المطلوبة للرمز البرمجي الذي لا يشكّل جزءًا من مشغّل خدمات الإضافة. ويوضّح التغييرات المطلوبة لتحسين أمان الإضافات. يتناول القسمان الآخران تعديل الرمز اللازم للترقية إلى الإصدار Manifest V3 واستبدال طلبات الويب التي تحظر المحتوى.
إزالة تنفيذ السلاسل العشوائية
لم يعُد بإمكانك تنفيذ منطق خارجي باستخدام executeScript() وeval() وnew Function().
- نقل جميع الرموز البرمجية الخارجية (JS وWasm وCSS) إلى حِزمة الإضافة
- عدِّل مراجع النصوص البرمجية والأنماط لتحميل الموارد من حزمة الإضافة.
- استخدِم
browser.runtime.getURL()لإنشاء عناوين URL للموارد في وقت التشغيل. - استخدام إطار iframe في وضع الحماية: لا يزال من الممكن استخدام
evalوnew Function(...)في إطارات iframe في وضع الحماية. لمزيد من التفاصيل، يُرجى الاطّلاع على الدليل حول إطارات iframe في وضع الحماية.
أصبح الآن بإمكانك العثور على الطريقة executeScript() في مساحة الاسم scripting بدلاً من مساحة الاسم tabs. للحصول على معلومات حول تعديل المكالمات، يُرجى الاطّلاع على نقل executeScript().
هناك بعض الحالات الخاصة التي يظلّ فيها تنفيذ السلاسل العشوائية ممكنًا:
- حقن أوراق أنماط مستضافة عن بُعد في صفحة ويب باستخدام insertCSS
- بالنسبة إلى الإضافات التي تستخدم
browser.devtools: تسمح الدالة inspectWindow.eval بتنفيذ JavaScript في سياق الصفحة التي يتم فحصها. - يمكن لإضافات أدوات تصحيح الأخطاء استخدام browser.debugger.sendCommand لتنفيذ JavaScript في هدف تصحيح الأخطاء.
إزالة الرموز البرمجية المستضافة عن بُعد
في الإصدار Manifest V3، يجب أن تكون جميع العمليات المنطقية الخاصة بإضافتك جزءًا من حزمة الإضافة. لم يعُد بإمكانك تحميل الملفات المستضافة عن بُعد وتنفيذها وفقًا لسياسة "سوق Chrome الإلكتروني". تشمل الأمثلة ما يلي:
- ملفات JavaScript التي يتم جلبها من خادم المطوّر
- أي مكتبة مستضافة على CDN
- مكتبات تابعة لجهات خارجية مجمّعة تسترد بشكل ديناميكي الرمز المستضاف عن بُعد
تتوفّر طرق بديلة، وذلك حسب حالة الاستخدام وسبب الاستضافة عن بُعد. يوضّح هذا القسم الأساليب التي يجب أخذها في الاعتبار. إذا كنت تواجه مشاكل في التعامل مع الرموز المستضافة عن بُعد، يمكنك الاطّلاع على الإرشادات المتاحة.
الميزات والمنطق المستند إلى الإعدادات
تحمّل الإضافة وتخزّن مؤقتًا إعدادات عن بُعد (مثل ملف JSON) في وقت التشغيل. يحدّد الإعداد المخزَّن مؤقتًا الميزات التي يتم تفعيلها.
منطق خارجي مع خدمة عن بُعد
يستدعي الإضافة خدمة ويب بعيدة. يتيح لك ذلك الحفاظ على خصوصية الرمز البرمجي وتغييره حسب الحاجة مع تجنُّب العبء الإضافي لإعادة إرساله إلى "سوق Chrome الإلكتروني".
تضمين رمز مُستضاف عن بُعد في إطار iframe في وضع الحماية
تتوفّر إمكانية استخدام الرموز المستضافة عن بُعد في إطارات iframe في وضع الحماية. يُرجى العِلم أنّ هذه الطريقة لا تعمل إذا كان الرمز يتطلّب الوصول إلى نموذج المستند الخاص بالصفحة المضمّنة.
تجميع مكتبات الجهات الخارجية
إذا كنت تستخدم إطار عمل شائعًا، مثل React أو Bootstrap، وكنت تحمّله سابقًا من خادم خارجي، يمكنك تنزيل الملفات المصغّرة وإضافتها إلى مشروعك واستيرادها محليًا. على سبيل المثال:
<script src="./react-dom.production.min.js"></script>
<link href="./bootstrap.min.css" rel="stylesheet">
لتضمين مكتبة في مشغّل خدمات، اضبط المفتاح "background.type" على "module" في ملف البيان واستخدِم عبارة import.
استخدام مكتبات خارجية في البرامج النصية التي يتم إدخالها في علامات التبويب
يمكنك أيضًا تحميل مكتبات خارجية في وقت التشغيل عن طريق إضافتها إلى مصفوفة files عند استدعاء scripting.executeScript(). سيظلّ بإمكانك تحميل البيانات عن بُعد في وقت التشغيل.
browser.scripting.executeScript({
target: {tabId: tab.id},
files: ['jquery-min.js', 'content-script.js']
});
إضافة دالة
إذا كنت بحاجة إلى المزيد من الديناميكية، تتيح لك السمة الجديدة func في scripting.executeScript() إدخال دالة كبرنامج نصي للمحتوى وتمرير المتغيرات باستخدام السمة args.
let name = 'World!'; browser.tabs.executeScript({ code: `alert('Hello, ${name}!')` });
في ملف نص برمجي للخلفية
async function getCurrentTab() {/* ... */} let tab = await getCurrentTab(); function showAlert(givenName) { alert(`Hello, ${givenName}`); } let name = 'World'; browser.scripting.executeScript({ target: {tabId: tab.id}, func: showAlert, args: [name], });
في عامل الخدمة الذي يعمل في الخلفية
يحتوي مستودع نماذج إضافات Chrome على مثال على إدخال دالة يمكنك تتبُّع خطواته. يمكنك الاطّلاع على مثال على getCurrentTab() في المرجع الخاص بهذه الدالة.
البحث عن حلول بديلة أخرى
إذا لم تساعدك الطرق السابقة في حالة الاستخدام، قد تحتاج إلى البحث عن حلّ بديل (أي الانتقال إلى مكتبة مختلفة) أو إيجاد طرق أخرى لاستخدام وظائف المكتبة. على سبيل المثال، في ما يتعلّق بخدمة "إحصاءات Google"، يمكنك التبديل إلى بروتوكول القياس من Google بدلاً من استخدام إصدار JavaScript الرسمي المستضاف عن بُعد كما هو موضّح في دليل "إحصاءات Google 4".
تعديل سياسة أمان المحتوى
لم تتم إزالة "content_security_policy" من ملف manifest.json، ولكنّه أصبح الآن قاموسًا يتيح سمتَين: "extension_pages" و"sandbox".
{ ... "content_security_policy": "default-src 'self'" ... }
{ ... "content_security_policy": { "extension_pages": "default-src 'self'", "sandbox": "..." } ... }
extension_pages: تشير إلى السياقات في الإضافة، بما في ذلك ملفات HTML وخدمات الخلفية.
sandbox: يشير إلى أي صفحات إضافات في وضع الحماية تستخدمها الإضافة.
إزالة سياسات أمان المحتوى غير المتوافقة
لا يسمح Manifest V3 بقيم معيّنة لسياسة أمان المحتوى في الحقل "extension_pages" التي كان Manifest V2 يسمح بها. على وجه التحديد، لا يسمح الإصدار Manifest V3 بتلك التي تسمح بتنفيذ الرموز البرمجية عن بُعد. يمكن أن تحتوي توجيهات script-src, وobject-src وworker-src على القيم التالية فقط:
selfnonewasm-unsafe-eval- الإضافات غير المضغوطة فقط: أي مصدر localhost (
http://localhostأوhttp://127.0.0.1أو أي منفذ على هذه النطاقات)
لا تتضمّن قيم سياسة أمان المحتوى الخاصة بـ sandbox أي قيود جديدة من هذا النوع.