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