ابقَ آمنًا

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

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

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

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

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

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

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

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

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

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

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

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

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

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.");
});