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

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

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

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

لم يعُد بإمكانك تنفيذ منطق خارجي باستخدام 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 في وضع الحماية. يُرجى العِلم أنّ هذه الطريقة لا تعمل إذا كان الرمز يتطلّب الوصول إلى نموذج المستند الخاص بالصفحة المضمّنة.

تجميع المكتبات التابعة لجهات خارجية

إذا كنت تستخدم إطار عمل شائعًا، مثل 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"، يمكنك التبديل إلى بروتوكول القياس من 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: يشير إلى أي صفحات إضافات في وضع الحماية تستخدمها الإضافة.

إزالة سياسات أمان المحتوى غير المتوافقة

لا يسمح الإصدار 3 من بيان الإضافة بقيم معيّنة لسياسة أمان المحتوى في الحقل "extension_pages" التي كان الإصدار 2 من بيان الإضافة يسمح بها. على وجه التحديد، لا يسمح Manifest V3 بتلك التي تسمح بتنفيذ الرموز البرمجية عن بُعد. يمكن أن تحتوي التوجيهات script-src, وobject-src وworker-src على القيم التالية فقط:

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

لا تنطبق أي قيود جديدة من هذا النوع على قيم سياسة أمان المحتوى الخاصة بالعنصر sandbox.