ابقَ آمنًا

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

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

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