ابقَ آمنًا

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

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

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

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

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

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

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

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

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

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

XMLHttpRequest مشترك المصدر

لا يمكن للإضافة استخدام XMLHttpRequest إلا للحصول على الموارد من نفسها ومن النطاقات المحددة في الأذونات.

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

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

تقييد حقول البيان

يؤدي تضمين عمليات تسجيل غير ضرورية في البيان إلى إنشاء ثغرات أمنية وزيادة إمكانية ظهور الإضافة. يمكنك حصر حقول البيان على تلك التي تعتمد عليها الإضافة وتوفير تسجيل حقل محدّد.

يمكن ربطه خارجيًا

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

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

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

إتاحة إمكانية الوصول إلى الموارد عبر الويب ضمن web_accessible_resources تجعل الإضافة قابلة لرصد المواقع الإلكترونية والمهاجمين.

{
  ...
  "web_accessible_resources": [
    "images/*.png",
    "style/secure_extension.css",
    "script/secure_extension.js"
  ],
  ...
}

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

تضمين سياسة أمان للمحتوى الفاضح

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

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

إذا كانت الإضافة تحتاج إلى أن تتضمن نصوصًا برمجية من مضيفين محددين، يمكن تضمينها:

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
  "content_security_policy": "default-src 'self' https://extension.resource.com"
  "manifest_version": 2
}

تجنب واجهات برمجة التطبيقات القابلة للتنفيذ

يجب استبدال واجهات برمجة التطبيقات التي تنفّذ التعليمات البرمجية ببدائل أكثر أمانًا.

document.write() وinnerHTML

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

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

eval()

تجنَّب استخدام eval() كلما أمكن ذلك لمنع الهجمات، حيث ينفِّذ eval() أي رمز يتم تمريره إليه، والذي قد يكون ضارًا.

var xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.example.com/data.json", true);
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4) {
    // WARNING! Might be evaluating an evil script!
    var resp = eval("(" + xhr.responseText + ")");
    ...
  }
}
xhr.send();

بدلاً من ذلك، من الأفضل استخدام طُرق أكثر أمانًا وسرعة، مثل JSON.parse()

var xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.example.com/data.json", true);
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4) {
    // JSON.parse does not evaluate the attacker's scripts.
    var resp = JSON.parse(xhr.responseText);
  }
}
xhr.send();

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

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

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

يجب تنفيذ العمل الحسّاس ضمن عملية مخصّصة، مثل النص البرمجي للخلفية في الإضافة. تجنَّب عرض امتيازات الإضافات للنصوص البرمجية للمحتوى عن طريق الخطأ:

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

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

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

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

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

function sanitizeInput(input) {
    return input.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;');
}