ابقَ آمنًا

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

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

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

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

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

عدم استخدام بروتوكول HTTP مطلقًا

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

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

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

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

جلب مشاركة المصدر()

ولا يمكن للإضافة استخدام سوى 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.");
});