এক্সটেনশনের নিরাপত্তা উন্নত করা

Manifest V3-তে নিরাপত্তা উন্নত করা

এক্সটেনশন পরিষেবা কর্মীর অংশ নয় এমন কোডের জন্য প্রয়োজনীয় পরিবর্তনের বিবরণ দেওয়া তিনটি বিভাগের মধ্যে এটি হল শেষ বিভাগ। এক্সটেনশনের নিরাপত্তা উন্নত করতে কী কী পরিবর্তন করতে হবে তা এতে বলা আছে। অন্য দুটি বিভাগে Manifest V3-তে আপগ্রেড করার জন্য প্রয়োজনীয় আপনার কোড আপডেট করা এবং ব্লকিং ওয়েব অনুরোধ পরিবর্তন করা সংক্রান্ত বিষয়গুলি অন্তর্ভুক্ত রয়েছে।

যেকোনও স্ট্রিংয়ের এক্সিকিউশন সরানো

আপনি আর executeScript(), eval() ও new Function() ব্যবহার করে এক্সটার্নাল লজিক এক্সিকিউট করতে পারবেন না।

  • সব এক্সটার্নাল কোড (JS, Wasm, CSS) আপনার এক্সটেনশন বান্ডেলে সরান।
  • এক্সটেনশন বান্ডেল থেকে রিসোর্স লোড করতে স্ক্রিপ্ট ও স্টাইল রেফারেন্স আপডেট করুন।
  • রানটাইমে রিসোর্স URL তৈরি করতে browser.runtime.getURL() ব্যবহার করুন।
  • স্যান্ডবক্স করা iframe ব্যবহার করুন: eval ও new Function(...) এখনও স্যান্ডবক্স করা iframe-এ কাজ করে। আরও বিবরণের জন্য স্যান্ডবক্স করা iframe সংক্রান্ত নির্দেশিকা পড়ুন।

executeScript() মেথডটি এখন tabs নেমস্পেসের পরিবর্তে scripting নেমস্পেসে আছে। কল আপডেট করা সংক্রান্ত তথ্যের জন্য, সরানো executeScript() দেখুন।

এমন কয়েকটি বিশেষ ক্ষেত্র আছে যেখানে এখনও নির্বিচারে স্ট্রিং এক্সিকিউট করা সম্ভব:

রিমোট হোস্টিং করা কোড সরিয়ে দেওয়া

Manifest V3-তে, আপনার এক্সটেনশনের সব লজিক অবশ্যই এক্সটেনশন প্যাকেজের অংশ হতে হবে। Chrome Web Store নীতি অনুযায়ী, আপনি আর রিমোট হোস্টেড ফাইল লোড ও এক্সিকিউট করতে পারবেন না। উদাহরণের মধ্যে অন্তর্ভুক্ত রয়েছে:

  • ডেভেলপারের সার্ভার থেকে জাভাস্ক্রিপ্ট ফাইল পুল করা হয়।
  • CDN-এ হোস্ট করা যেকোনও লাইব্রেরি।
  • বান্ডেল করা থার্ড-পার্টি লাইব্রেরি যা ডায়নামিক পদ্ধতিতে রিমোট হোস্ট করা কোড ফেচ করে।

আপনার ব্যবহারের ক্ষেত্র এবং রিমোট হোস্টিংয়ের কারণের উপর নির্ভর করে বিকল্প পদ্ধতি উপলভ্য। এই বিভাগে বিবেচনা করার মতো বিভিন্ন দৃষ্টিভঙ্গির বিবরণ দেওয়া আছে। রিমোট হোস্টেড কোড নিয়ে কাজ করতে সমস্যা হলে, আমাদের কাছে নির্দেশিকা উপলভ্য আছে।

কনফিগারেশন-চালিত ফিচার ও লজিক

আপনার এক্সটেনশন রানটাইমে একটি রিমোট কনফিগারেশন (যেমন, JSON ফাইল) লোড ও ক্যাশে করে। কোন কোন ফিচার চালু করা হবে তা ক্যাশে করা কনফিগারেশন থেকে জানা যায়।

রিমোট পরিষেবার মাধ্যমে এক্সটার্নাল লজিক

আপনার এক্সটেনশন একটি রিমোট ওয়েব সার্ভিস কল করে। এর ফলে, আপনি কোড ব্যক্তিগত রাখতে এবং প্রয়োজন অনুযায়ী পরিবর্তন করতে পারবেন, একই সাথে Chrome Web Store-এ আবার জমা দেওয়ার অতিরিক্ত ঝামেলা এড়াতে পারবেন।

স্যান্ডবক্স করা আইফ্রেমে রিমোট লোকেশন থেকে হোস্ট করা কোড এম্বেড করা

রিমোট লোকেশন থেকে হোস্ট করা কোড স্যান্ডবক্স করা iframe-এ কাজ করে। মনে রাখবেন, কোডটি যদি এম্বেড করা পৃষ্ঠার DOM অ্যাক্সেস করতে চায়, তাহলে এই পদ্ধতি কাজ করে না।

থার্ড-পার্টি লাইব্রেরি বান্ডেল করা

আপনি যদি React বা Bootstrap-এর মতো জনপ্রিয় ফ্রেমওয়ার্ক ব্যবহার করেন যা আগে এক্সটার্নাল সার্ভার থেকে লোড করতেন, তাহলে আপনি মিনিফাই করা ফাইল ডাউনলোড করে, সেগুলি আপনার প্রোজেক্টে যোগ করতে এবং লোকালি ইমপোর্ট করতে পারবেন। যেমন:

<script src="./react-dom.production.min.js"></script>
<link href="./bootstrap.min.css" rel="stylesheet">

সার্ভিস ওয়ার্কের মধ্যে লাইব্রেরি যোগ করতে, ম্যানিফেস্টে "background.type" কী-এর মান "module" হিসেবে সেট করুন এবং import স্টেটমেন্ট ব্যবহার করুন।

ট্যাব-ইনজেক্ট করা স্ক্রিপ্টে এক্সটার্নাল লাইব্রেরি ব্যবহার করা

এছাড়াও, scripting.executeScript() কল করার সময় files অ্যারেতে যোগ করে রানটাইমে এক্সটার্নাল লাইব্রেরি লোড করতে পারবেন। আপনি এখনও রানটাইমে রিমোট লোকেশন থেকে ডেটা লোড করতে পারবেন।

browser.scripting.executeScript({
  target: {tabId: tab.id},
  files: ['jquery-min.js', 'content-script.js']
});

ফাংশন ইনজেক্ট করা

আরও বেশি ডাইনামিজম প্রয়োজন হলে, scripting.executeScript()-এর মধ্যে থাকা নতুন func প্রপার্টি আপনাকে কন্টেন্ট স্ক্রিপ্ট হিসেবে ফাংশন ইনজেক্ট করতে এবং args প্রপার্টি ব্যবহার করে ভেরিয়েবল পাস করতে দেয়।

Manifest V2
let name = 'World!';
browser.tabs.executeScript({
  code: `alert('Hello, ${name}!')`
});

ব্যাকগ্রাউন্ড স্ক্রিপ্ট ফাইলে।

Manifest V3
async function getCurrentTab() {/* ... */}
let tab = await getCurrentTab();

function showAlert(givenName) {
  alert(`Hello, ${givenName}`);
}

let name = 'World';
browser.scripting.executeScript({
  target: {tabId: tab.id},
  func: showAlert,
  args: [name],
});

ব্যাকগ্রাউন্ডে সার্ভিস ওয়ার্কার।

Chrome এক্সটেনশন স্যাম্পেল রেপোতে একটি ফাংশন ইনজেকশন সংক্রান্ত উদাহরণ রয়েছে, আপনি সেটি ধাপে ধাপে অনুসরণ করতে পারেন। getCurrentTab()-এর উদাহরণ সেই ফাংশনের রেফারেন্সে দেওয়া আছে।

অন্যান্য বিকল্প সমাধান খুঁজে দেখুন

আগের পদ্ধতিগুলি আপনার ব্যবহারের ক্ষেত্রে সাহায্য না করলে, আপনাকে হয় একটি বিকল্প সমাধান খুঁজে বের করতে হবে (যেমন, অন্য লাইব্রেরিতে মাইগ্রেট করা) অথবা লাইব্রেরির কার্যকারিতা ব্যবহার করার অন্যান্য উপায় খুঁজে বের করতে হবে। যেমন, Google Analytics-এর ক্ষেত্রে, আমাদের Google Analytics 4 গাইড-এ বর্ণিত অফিসিয়াল রিমোট-হোস্টেড JavaScript ভার্সন ব্যবহার করার পরিবর্তে আপনি Google পরিমাপ প্রোটোকলে পরিবর্তন করতে পারবেন।

কন্টেন্ট নিরাপত্তা নীতি আপডেট করা

manifest.json ফাইল থেকে "content_security_policy" সরানো হয়নি, তবে এটি এখন একটি ডিকশনারি যা দুটি প্রপার্টিতে কাজ করে: "extension_pages" এবং "sandbox".

Manifest V2
{
  ...
  "content_security_policy": "default-src 'self'"
  ...
}
Manifest V3
{
  ...
  "content_security_policy": {
    "extension_pages": "default-src 'self'",
    "sandbox": "..."
  }
  ...
}

extension_pages: আপনার এক্সটেনশনের প্রসঙ্গকে বোঝায়, যার মধ্যে html ফাইল ও সার্ভিস ওয়ার্কার অন্তর্ভুক্ত।

sandbox: আপনার এক্সটেনশন ব্যবহার করে এমন যেকোনও স্যান্ডবক্সড এক্সটেনশন পৃষ্ঠা বোঝায়।

কাজ করে না এমন কন্টেন্ট নিরাপত্তা নীতি সরিয়ে দেওয়া

Manifest V3-তে "extension_pages" ফিল্ডে কন্টেন্ট নিরাপত্তা নীতির নির্দিষ্ট কিছু ভ্যালু ব্যবহার করা যায় না, যা Manifest V2-তে ব্যবহার করা যেত। Manifest V3 বিশেষভাবে সেইসব অনুমতি দেয় না যেগুলি রিমোট কোড এক্সিকিউশনের অনুমতি দেয়। script-src, object-src এবং worker-src ডাইরেক্টিভে শুধুমাত্র নিম্নলিখিত মান থাকতে পারে:

  • self
  • none
  • wasm-unsafe-eval
  • শুধুমাত্র আনপ্যাক করা এক্সটেনশন: যেকোনও লোকালহোস্ট সোর্স, (http://localhost, http://127.0.0.1, অথবা সেইসব ডোমেনে যেকোনও পোর্ট)

sandbox-এর কন্টেন্ট সুরক্ষা নীতি ভ্যালুতে এই ধরনের কোনও নতুন বিধিনিষেধ নেই।