تحسين الأمان في الإصدار 3 من ملف البيان
هذا هو القسم الأخير من الأقسام الثلاثة التي تصف التغييرات المطلوبة في الرمز البرمجي الذي لا يُعدّ جزءًا من عامل الخدمة في إضافة Chrome. ويوضّح التغييرات المطلوبة لتحسين أمان الإضافات. يتناول القسمان الآخران تعديل الرمز البرمجي المطلوب للترقية إلى الإصدار 3 من ملف البيان واستبدال عمليات حظر طلبات الويب.
إزالة تنفيذ سلاسل عشوائية
لم يعُد بإمكانك تنفيذ منطق خارجي باستخدام 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"، يمكنك التبديل إلى Measurement protocol من 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
أي قيود جديدة من هذا النوع.