ابقَ آمنًا

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

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

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

إبقاء المجموعات انتقائية

في حال استخدام النشر الجماعي، يجب حصر المجموعة بالمطوّرين الموثوق بهم. لا تقبل طلبات الانضمام من أشخاص غير معروفين.

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

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

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

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

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

دالة 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
}

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

{
  "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";

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

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

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