ابقَ آمنًا

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

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

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