ابقَ آمنًا

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

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

يتم تحميل رمز الإضافة وتحديثه من خلال حسابات 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.");
});