নিরাপদে থাকুন

এক্সটেনশনগুলোর ব্রাউজারের মধ্যে বিশেষ সুবিধা ব্যবহারের সুযোগ থাকে, যা সেগুলোকে আক্রমণকারীদের জন্য একটি লোভনীয় লক্ষ্যে পরিণত করে। যদি কোনো এক্সটেনশন হ্যাক হয়, তবে সেই এক্সটেনশনের প্রত্যেক ব্যবহারকারী ক্ষতিকর ও অনাকাঙ্ক্ষিত অনুপ্রবেশের ঝুঁকিতে পড়ে। এই পদ্ধতিগুলো অনুসরণ করে একটি এক্সটেনশনকে সুরক্ষিত রাখুন এবং এর ব্যবহারকারীদের সুরক্ষিত রাখুন।

ডেভেলপার অ্যাকাউন্ট সুরক্ষিত রাখুন

এক্সটেনশন কোড গুগল অ্যাকাউন্টের মাধ্যমে আপলোড ও আপডেট করা হয়। যদি ডেভেলপারদের অ্যাকাউন্ট হ্যাক হয়, তবে একজন আক্রমণকারী সরাসরি সকল ব্যবহারকারীর কাছে ক্ষতিকারক কোড পাঠিয়ে দিতে পারে। বিশেষভাবে ডেভেলপার অ্যাকাউন্ট তৈরি করে এবং টু-ফ্যাক্টর অথেনটিকেশন চালু করার মাধ্যমে এই অ্যাকাউন্টগুলোকে সুরক্ষিত রাখুন, বিশেষত একটি সিকিউরিটি কী ব্যবহার করে।

দলগুলোকে বাছাই করে রাখুন

গ্রুপ পাবলিশিং ব্যবহার করলে, গ্রুপটি শুধুমাত্র বিশ্বস্ত ডেভেলপারদের মধ্যে সীমাবদ্ধ রাখুন। অপরিচিত ব্যক্তিদের কাছ থেকে সদস্যপদের অনুরোধ গ্রহণ করবেন না।

কখনোই HTTP ব্যবহার করবেন না।

ডেটা অনুরোধ বা প্রেরণ করার সময় HTTP সংযোগ এড়িয়ে চলুন। ধরে নিন যে যেকোনো HTTP সংযোগে আড়িপাতা থাকবে অথবা তাতে পরিবর্তন করা থাকবে। সর্বদা HTTPS-কে অগ্রাধিকার দেওয়া উচিত, কারণ এতে অন্তর্নির্মিত নিরাপত্তা ব্যবস্থা রয়েছে যা বেশিরভাগ ম্যান-ইন-দ্য-মিডল আক্রমণ প্রতিরোধ করে।

ন্যূনতম অনুমতির জন্য অনুরোধ করুন

ক্রোম ব্রাউজার একটি এক্সটেনশনের অ্যাক্সেসকে শুধুমাত্র সেইসব প্রিভিলেজের মধ্যে সীমাবদ্ধ রাখে, যেগুলোর জন্য ম্যানিফেস্টে স্পষ্টভাবে অনুরোধ করা হয়েছে। এক্সটেনশনগুলোর উচিত শুধুমাত্র সেইসব এপিআই (API) এবং ওয়েবসাইট রেজিস্টার করার মাধ্যমে তাদের পারমিশন সীমিত রাখা, যেগুলোর ওপর তারা নির্ভরশীল। অপ্রয়োজনীয় কোড ন্যূনতম পর্যায়ে রাখা উচিত।

কোনো এক্সটেনশনের বিশেষাধিকার সীমিত করলে, একজন সম্ভাব্য আক্রমণকারী কী কাজে লাগাতে পারবে তাও সীমিত হয়ে যায়।

ক্রস-অরিজিন এক্সএমএলএইচটিটিপি অনুরোধ

একটি এক্সটেনশন শুধুমাত্র নিজের থেকে এবং অনুমতিতে নির্দিষ্ট করা ডোমেইনগুলো থেকে রিসোর্স পেতে XMLHttpRequest ব্যবহার করতে পারে।

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

এই এক্সটেনশনটি তার পারমিশনে "/*" এবং "https://*google.com/" উল্লেখ করার মাধ্যমে developer.chrome.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

document.write() এবং innerHTML ব্যবহার করে ডাইনামিকভাবে HTML এলিমেন্ট তৈরি করা সহজ হলেও, এতে এক্সটেনশনটি এবং এর ওপর নির্ভরশীল ওয়েব পেজগুলো আক্রমণকারীদের দ্বারা ক্ষতিকারক স্ক্রিপ্ট ঢোকানোর ঝুঁকিতে থাকে। এর পরিবর্তে, ম্যানুয়ালি 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 ) মাধ্যমে ডেটা ফাঁসের ঝুঁকিতে থাকে এবং কোনো ক্ষতিকারক ওয়েব পেজ রেন্ডারার প্রসেসকে কম্প্রোমাইজ করলে আক্রমণকারীর দ্বারা এর নিয়ন্ত্রণ নেওয়ার সম্ভাবনা থাকে।

সংবেদনশীল কাজ একটি নির্দিষ্ট প্রসেসে করা উচিত, যেমন এক্সটেনশনটির ব্যাকগ্রাউন্ড স্ক্রিপ্ট । ভুলবশত কন্টেন্ট স্ক্রিপ্টের কাছে এক্সটেনশনের বিশেষাধিকার প্রকাশ করা থেকে বিরত থাকুন:

  • ধরে নিন যে একটি কন্টেন্ট স্ক্রিপ্ট থেকে আসা বার্তাগুলো কোনো আক্রমণকারী দ্বারা তৈরি করা হয়ে থাকতে পারে (যেমন, সমস্ত ইনপুট যাচাই ও পরিমার্জন করুন এবং আপনার স্ক্রিপ্টগুলোকে ক্রস-সাইট স্ক্রিপ্টিং থেকে সুরক্ষিত রাখুন)।
  • মনে রাখবেন, কন্টেন্ট স্ক্রিপ্টে পাঠানো যেকোনো ডেটা ওয়েব পেজে ফাঁস হয়ে যেতে পারে। কন্টেন্ট স্ক্রিপ্টে সংবেদনশীল ডেটা (যেমন এক্সটেনশনের গোপনীয় তথ্য, অন্যান্য ওয়েব অরিজিনের ডেটা, ব্রাউজিং হিস্ট্রি) পাঠাবেন না।
  • কন্টেন্ট স্ক্রিপ্ট দ্বারা ট্রিগার করা যেতে পারে এমন বিশেষাধিকারপ্রাপ্ত ক্রিয়াকলাপগুলির পরিধি সীমিত করুন। কন্টেন্ট স্ক্রিপ্টকে যথেচ্ছ URL-এ অনুরোধ ট্রিগার করতে বা এক্সটেনশন API-গুলিতে যথেচ্ছ আর্গুমেন্ট পাস করতে দেবেন না (যেমন, fetch বা chrome.tabs.create API-তে যথেচ্ছ URL পাস করার অনুমতি দেবেন না)।

ইনপুটগুলি নিবন্ধন এবং স্যানিটাইজ করুন

লিসেনারকে শুধুমাত্র এক্সটেনশনের প্রত্যাশিত তথ্যের মধ্যে সীমাবদ্ধ রেখে, আগত ডেটার প্রেরকদের যাচাই করে এবং সমস্ত ইনপুট স্যানিটাইজ করার মাধ্যমে একটি এক্সটেনশনকে ক্ষতিকারক স্ক্রিপ্ট থেকে সুরক্ষিত রাখুন।

একটি এক্সটেনশন কেবল তখনই 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.");
});

ব্যবহারকারীর ইনপুট এবং আগত ডেটা, এমনকি এক্সটেনশনটি নিজে এবং অনুমোদিত উৎস থেকে আসা ডেটাও স্যানিটাইজ করার মাধ্যমে, কোনো এক্সটেনশনকে আক্রমণকারীর স্ক্রিপ্ট চালানো থেকে বিরত রাখুন। এক্সিকিউটেবল এপিআই (API) পরিহার করুন

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