ابقَ آمنًا

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

حماية حسابات المطوِّرين

يتم تحميل رمز الإضافة وتعديله من خلال حسابات Google. في حال تعرّض حسابات المطوّرين للاختراق، يمكن للمهاجم إرسال رمز برمجي ضار مباشرةً إلى جميع المستخدمين. يمكنك حماية هذه الحسابات من خلال تفعيل ميزة المصادقة الثنائية، ويُفضّل استخدام مفتاح أمان.

استخدام أدوار الأعضاء المناسبة

إذا كان الناشر لديه أعضاء متعدّدون، تأكَّد من أنّ الدور الممنوح لكل مستخدم مناسب.

عدم استخدام HTTP مطلقًا

عند طلب البيانات أو إرسالها، تجنَّب استخدام اتصال HTTP. افترض أنّ أي اتصالات HTTP ستكون عرضة للتنصّت أو التعديل. يجب دائمًا تفضيل استخدام HTTPS، لأنّه يتضمّن ميزات أمان مدمجة تتجنّب معظم الهجمات الوسيطة.

طلب الحدّ الأدنى من الأذونات

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

يؤدي الحدّ من امتيازات الإضافة إلى الحدّ من ما يمكن أن يستغله مهاجم محتمل.

استرجاع البيانات من مصادر متعددة باستخدام fetch()

لا يمكن للإضافة استخدام fetch() وXMLHttpRequest() إلا للحصول على موارد من الإضافة ومن النطاقات المحدّدة في الأذونات. يُرجى العِلم أنّ طلبات البحث في كليهما يتم اعتراضها من خلال معالج fetch في مشغّل الخدمات.

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
  "host_permissions": [
    "https://developer.chrome.com/*",
    "https://*.google.com/*"
  ],
  "manifest_version": 3
}

تطلب هذه الإضافة في المثال أعلاه إذن الوصول إلى أي محتوى على developer.chrome.com والنطاقات الفرعية من Google من خلال إدراج "https://developer.chrome.com/*" و"https://*.google.com/*" في الأذونات. في حال تعرّض الإضافة للاختراق، سيظل بإمكانها التفاعل فقط مع المواقع الإلكترونية التي تستوفي نمط المطابقة. لن يتمكّن المهاجم إلا من الوصول بشكل محدود إلى "https://user_bank_info.com" أو التفاعل مع "https://malicious_website.com".

الحدّ من حقول البيان

يؤدي تضمين مفاتيح وأذونات غير ضرورية في البيان إلى حدوث ثغرات أمنية وزيادة إمكانية رصد الإضافة. احصر حقول ملف البيان على تلك التي تعتمد عليها الإضافة.

قابلة للربط خارجيًا

استخدِم الحقل "externally_connectable" لتحديد الإضافات الخارجية وصفحات الويب التي ستتبادل الإضافة المعلومات معها. تقييد الجهات الخارجية التي يمكن أن تتواصل معها الإضافة لتقتصر على المصادر الموثوقة

{
  "name": "Super Safe Extension",
  "externally_connectable": {
    "ids": [
      "iamafriendlyextensionhereisdatas"
    ],
    "matches": [
      "https://developer.chrome.com/*",
      "https://*.google.com/*"
    ],
    "accepts_tls_channel_id": false
  },
  ...
}

المراجع التي يمكن الوصول إليها على الويب

إنّ إتاحة الوصول إلى الموارد من خلال الويب، ضمن "web_accessible_resources"، سيؤدي إلى إمكانية رصد الإضافة من قِبل المواقع الإلكترونية والمهاجمين.

{
  ...
  "web_accessible_resources": [
    {
      "resources": [ "test1.png", "test2.png" ],
      "matches": [ "https://web-accessible-resources-1.glitch.me/*" ]
    }
  ]
  ...
}

كلما زاد عدد الموارد المتاحة على الويب، زادت الطرق التي يمكن للمهاجم المحتمل استغلالها. يجب أن تكون هذه الملفات في الحد الأدنى.

تضمين سياسة أمان محتوى صريحة

أدرِج سياسة أمان المحتوى الخاصة بالإضافة في ملف البيان لمنع الهجمات التي تستخدم نصوصًا برمجية على المواقع الإلكترونية. إذا كانت الإضافة تحمّل الموارد من نفسها فقط، سجِّل ما يلي:

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
   "content_security_policy": {
    "extension_pages": "default-src 'self'"
  },
  "manifest_version": 3
}

إذا كانت الإضافة بحاجة إلى استخدام WebAssembly أو زيادة القيود المفروضة على الصفحات المحصورة في بيئة الاختبار، يمكن إضافتها:

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
   "content_security_policy": {
    "extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self';",
    "sandboxed_pages":"script-src 'self' 'wasm-unsafe-eval'; object-src 'self';"
  },

  "manifest_version": 3
}

تجنُّب استخدام document.write()‎ وinnerHTML

على الرغم من أنّ إنشاء عناصر HTML ديناميكية باستخدام document.write() وinnerHTML قد يكون أبسط، إلا أنّه يترك الإضافة وصفحات الويب التي تعتمد عليها الإضافة عرضة لإدراج نصوص برمجية ضارة من قِبل المخترقين. بدلاً من ذلك، يمكنك إنشاء عُقد DOM يدويًا واستخدام innerText لإدراج محتوى ديناميكي.

function constructDOM() {
  let newTitle = document.createElement('h1');
  newTitle.innerText = host;
  document.appendChild(newTitle);
}

استخدام النصوص البرمجية للمحتوى بحذر

على الرغم من أنّ نصوص المحتوى البرمجية تعمل في بيئة معزولة، إلا أنّها ليست محصّنة ضد الهجمات:

  • نصوص المحتوى البرمجية هي الجزء الوحيد من الإضافة الذي يتفاعل مباشرةً مع صفحة الويب. لهذا السبب، قد تتلاعب صفحات الويب الضارة بأجزاء من نموذج المستند (DOM) الذي يعتمد عليه النص البرمجي للمحتوى، أو تستغل السلوك المفاجئ لمعايير الويب، مثل العناصر المسماة.
  • للتفاعل مع نموذج المستند (DOM) لصفحات الويب، يجب أن يتم تنفيذ النصوص البرمجية للمحتوى في عملية العرض نفسها التي يتم فيها عرض صفحة الويب. وهذا يجعل النصوص البرمجية للمحتوى عرضة لتسريب البيانات من خلال هجمات القنوات الجانبية (مثل Spectre)، كما يجعلها عرضة للاستيلاء عليها من قِبل مهاجم إذا تمكّنت صفحة ويب ضارة من اختراق عملية العرض.

يجب تنفيذ العمليات التي تستخدم بيانات حسّاسة (مثل المعلومات الخاصة بالمستخدم) أو واجهات برمجة تطبيقات Chrome التي يمكنها الوصول إلى وظائف المتصفّح في مشغّل الخدمات الخاص بالإضافات. تجنُّب عرض امتيازات الإضافة عن طريق الخطأ للنصوص البرمجية للمحتوى:

تسجيل المدخلات وتنقيحها

يمكنك حماية الإضافة من النصوص البرمجية الضارة من خلال حصر المستمعين على ما تتوقّعه الإضافة فقط، والتحقّق من صحة مرسلي البيانات الواردة، وتنظيف جميع المدخلات.

يجب ألا تسجّل الإضافة runtime.onMessageExternal إلا إذا كانت تتوقّع تلقّي رسائل من موقع إلكتروني أو إضافة خارجية. احرص دائمًا على التأكّد من أنّ المُرسِل يطابق مصدرًا موثوقًا.

// The ID of an external extension
const kFriendlyExtensionId = "iamafriendlyextensionhereisdatas";

browser.runtime.onMessageExternal.addListener(
  function(request, sender, sendResponse) {
    if (sender.id === kFriendlyExtensionId)
      doSomething();
});

حتى الرسائل التي يتم إرسالها عبر حدث runtime.onMessage من الإضافة نفسها يجب التدقيق فيها للتأكّد من أنّ MessageSender ليس من نص برمجي للمحتوى تم اختراقه.

browser.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  if (request.allowedAction)
    console.log("This is an allowed action.");
});