تحسين أمان الإضافة

تحسين الأمان في الإصدار 3 من ملف البيان

هذا هو القسم الأخير من الأقسام الثلاثة التي تصف التغييرات المطلوبة في الرمز البرمجي الذي لا يُعدّ جزءًا من عامل الخدمة في إضافة Chrome. ويوضّح التغييرات المطلوبة لتحسين أمان الإضافات. يتناول القسمان الآخران تعديل الرمز البرمجي المطلوب للترقية إلى الإصدار 3 من ملف البيان واستبدال عمليات حظر طلبات الويب.

إزالة تنفيذ سلاسل عشوائية

لم يعُد بإمكانك تنفيذ منطق خارجي باستخدام executeScript() وeval() وnew Function().

  • نقل كل الرموز البرمجية الخارجية (JavaScript وWasm وCSS) إلى حِزمة الإضافة
  • عدِّل إشارات النصوص البرمجية والأنماط لتحميل الموارد من حِزمة الإضافة.
  • استخدِم chrome.runtime.getURL() لإنشاء عناوين URL للموارد أثناء التشغيل.
  • استخدام إطار iframe في وضع الحماية: لا تزال eval وnew Function(...) متوافقة في إطارات iframe في وضع الحماية. لمزيد من التفاصيل، يُرجى الاطّلاع على الدليل حول إطارات iframe في وضع الحماية.

أصبحت الطريقة executeScript() الآن في مساحة الاسم scripting بدلاً من مساحة الاسم tabs. للحصول على معلومات عن تعديل المكالمات، يُرجى الاطّلاع على مقالة نقل executeScript().

هناك بعض الحالات الخاصة التي لا يزال فيها تنفيذ سلاسل عشوائية ممكنًا:

إزالة الرمز المستضاف عن بُعد

في 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.

Manifest V2
let name = 'World!';
chrome.tabs.executeScript({
  code: `alert('Hello, ${name}!')`
});

في ملف نص برمجي للخلفية

الإصدار 3 من ملف البيان
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".

Manifest V2
{
  ...
  "content_security_policy": "default-src 'self'"
  ...
}
الإصدار 3 من ملف البيان
{
  ...
  "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 أي قيود جديدة من هذا النوع.