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

تحسين الأمان في إصدار Manifest V3

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

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

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

  • انقل كل الرموز الخارجية (JS و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}!')`
});

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

إصدار Manifest V3
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'"
  ...
}
إصدار Manifest V3
{
  ...
  "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 القيم التالية فقط:

  • self
  • none
  • wasm-unsafe-eval
  • الإضافات غير المضغوطة فقط: أي مصدر مضيف محلي، (http://localhost أو http://127.0.0.1 أو أي منفذ على هذه النطاقات)

ولا تشتمل قيم سياسة أمان المحتوى لـ sandbox على مثل هذه القيود الجديدة.