Chrome document.domain পরিবর্তন করা অক্ষম করে৷

আপনার ওয়েবসাইট যদি document.domain সেট করার উপর নির্ভর করে, তাহলে আপনার পদক্ষেপ নেওয়া প্রয়োজন।

কী পরিবর্তন হচ্ছে এবং কেন?

ক্রোম ১১৫ থেকে, ওয়েবসাইটগুলো আর document.domain সেট করতে পারবে না: ক্রোম document.domain অপরিবর্তনীয় করে দেবে। বিভিন্ন অরিজিনের মধ্যে যোগাযোগের জন্য, আপনাকে postMessage() অথবা চ্যানেল মেসেজিং এপিআই (Channel Messaging API)-এর মতো বিকল্প পদ্ধতি ব্যবহার করতে হবে।

অনুগ্রহ করে মনে রাখবেন যে এই পরিবর্তনটি পর্যায়ক্রমে চালু করা হবে।

আমরা আশা করি, অন্যান্য ব্রাউজারগুলোও অবশেষে এই কার্যকারিতাটি বাতিল করে দেবে এবং সরিয়ে ফেলবে। বিস্তারিত জানতে ব্রাউজার সামঞ্জস্যতা বিভাগটি পর্যালোচনা করুন।

কেন document.domain কে অপরিবর্তনীয় করা হয়?

document.domain অরিজিনের হোস্টনেম পেতে বা সেট করার জন্য ডিজাইন করা হয়েছিল। অনেক ওয়েবসাইট একই সাইটের কিন্তু ভিন্ন অরিজিনের পেজগুলোর মধ্যে যোগাযোগের জন্য document.domain সেট করে থাকে।

যদিও এটি একটি সুবিধাজনক কৌশল, এটি একটি নিরাপত্তা ঝুঁকি তৈরি করে, কারণ এটি সেম-অরিজিন পলিসিকে শিথিল করেdocument.domain কে ঘিরে নিরাপত্তা সংক্রান্ত উদ্বেগের কারণে স্পেসিফিকেশনে একটি পরিবর্তন আনা হয়েছে, যা ব্যবহারকারীদের এটি ব্যবহার করা থেকে বিরত থাকতে সতর্ক করে

বিস্তারিতভাবে: কেন document.domain-কে অপরিবর্তনীয় করা হয়?

বর্তমানে document.domain কীভাবে ব্যবহৃত হয়

অনেক ওয়েবসাইট একই সাইটের কিন্তু ভিন্ন অরিজিনের পেজগুলোর মধ্যে যোগাযোগের জন্য document.domain সেট করে থাকে।

একই সাইটের কিন্তু ভিন্ন অরিজিনের সাইটগুলোর একই eTLD+1 থাকলেও সাবডোমেইনগুলো ভিন্ন হয়।

এখন পর্যন্ত document.domain যেভাবে ব্যবহৃত হয়ে আসছে তা নিচে দেওয়া হলো:

ধরা যাক, https://parent.example.com এর একটি পেজ https://video.example.com থেকে একটি আইফ্রেম পেজ এমবেড করে। এই পেজগুলোর একই eTLD+1 ( example.com ) আছে, কিন্তু সাবডোমেইনগুলো ভিন্ন। যখন উভয় পেজের document.domain 'example.com' এ সেট করা থাকে, তখন ব্রাউজার দুটি অরিজিনকে একই-অরিজিন হিসেবে বিবেচনা করে।

https://parent.example.com এর জন্য document.domain সেট করুন:

// Confirm the current origin of "parent.example.com"
console.log(document.domain);

// Set the document.domain
document.domain = 'example.com';
console.log(document.domain);

https://video.example.com এর জন্য document.domain সেট করুন:

// Confirm the current origin of "video.example.com"
console.log(document.domain);

// Set the document.domain
document.domain = 'example.com';
console.log(document.domain);

আপনি এখন https://parent.example.com এর উপর https://video.example.com বিপরীতে একটি ক্রস-অরিজিন DOM ম্যানিপুলেশন তৈরি করতে পারবেন।

ওয়েবসাইটগুলো একই সাইটের ডকুমেন্টগুলোর মধ্যে যোগাযোগ আরও সহজ করার জন্য document.domain সেট করে। যেহেতু এই পরিবর্তনটি `same-origin policy`-কে শিথিল করে , তাই প্যারেন্ট পেজটি iframe-এর ডকুমেন্ট অ্যাক্সেস করতে এবং DOM ট্রি ট্র্যাভার্স করতে পারে, এবং এর বিপরীতটিও সম্ভব হয়।

এটি একটি সুবিধাজনক কৌশল, তবে এতে নিরাপত্তা ঝুঁকি রয়েছে।

document.domain নিয়ে নিরাপত্তা সংক্রান্ত উদ্বেগ

document.domain সংক্রান্ত নিরাপত্তা উদ্বেগের কারণে স্পেসিফিকেশনে একটি পরিবর্তন আনা হয়েছে, যা ব্যবহারকারীদের এটি ব্যবহার করা থেকে বিরত থাকতে সতর্ক করে

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

document.domain সেট করার নিরাপত্তাগত প্রভাব সম্পর্কে আরও জানতে, MDN-এর 'Document.domain' পৃষ্ঠাটি পড়ুন।

ব্রাউজার সামঞ্জস্যতা

আমার সাইটটি প্রভাবিত হয়েছে কিনা তা আমি কীভাবে জানব?

যদি আপনার ওয়েবসাইট এই পরিবর্তনের দ্বারা প্রভাবিত হয়, তাহলে Chrome আপনাকে DevTools Issues প্যানেলে সতর্ক করবে — এই সতর্কতাটি ২০২২ সালে যোগ করা হয়েছে। DevTools-এর উপরের ডানদিকে থাকা হলুদ পতাকাটি লক্ষ্য করুন।

DevTools-এ সমস্যা সতর্কীকরণের স্ক্রিনশট

ক্রোম থেকে সরিয়ে ফেলার জন্য নির্ধারিত সমস্ত এপিআই খুঁজে বের করতে, আপনি আপনার সাইটটিকে লাইটহাউস ডেপ্রিকেটেড এপিআই অডিটের মাধ্যমেও চালাতে পারেন।

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

আমি এই পরিবর্তনটি বাস্তবে কীভাবে দেখতে পাব?

এই পরিবর্তনটি ক্রোম ১১৫ থেকে পর্যায়ক্রমে চালু করা হবে। আপনার ক্রোম ব্রাউজারে এই পরিবর্তনটি এখনও চালু না হলেও, এটি কার্যকর দেখতে আপনি নিম্নোক্তভাবে এটি চালু করতে পারেন:

  1. chrome://flags/#origin-agent-cluster-default খুলুন
  2. সক্ষম করুন নির্বাচন করুন।
  3. ক্রোম পুনরায় চালু করুন।

আমি আর কী বিকল্প ব্যবহার করতে পারি?

সবচেয়ে ভালো উপায় হলো document.domain একেবারেই পরিবর্তন না করা, যেমন—পৃষ্ঠা এবং এর অন্তর্ভুক্ত সমস্ত ফ্রেমকে একই অরিজিনে হোস্ট করা। এটি সব ব্রাউজারের সব সংস্করণে কাজ করে। কিন্তু এর জন্য একটি অ্যাপ্লিকেশনে যথেষ্ট পুনর্গঠনের প্রয়োজন হতে পারে, তাই এমন বিকল্পগুলোও খতিয়ে দেখা উচিত যা ক্রস-অরিজিন অ্যাক্সেস সমর্থন করে।

document.domain এর পরিবর্তে postMessage() অথবা চ্যানেল মেসেজিং এপিআই ব্যবহার করুন।

বেশিরভাগ ক্ষেত্রে, document.domain পরিবর্তে `cross-origin postMessage() অথবা `Channel Messaging API` ব্যবহার করা যেতে পারে।

নিম্নলিখিত উদাহরণে:

  1. https://parent.example.com একটি আইফ্রেমের মধ্যে থেকে postMessage() এর মাধ্যমে একটি বার্তা পাঠিয়ে https://video.example.com DOM পরিবর্তন করার জন্য অনুরোধ করে।
  2. https://video.example.com বার্তাটি পাওয়া মাত্রই DOM পরিবর্তন করে এবং প্যারেন্টকে সফলতার খবর জানিয়ে দেয়।
  3. https://parent.example.com সাফল্যটি স্বীকার করে।

https://parent.example.com এ :

// Send a message to https://video.example.com
iframe.postMessage('Request DOM manipulation', 'https://video.example.com');

// Receive messages
iframe.addEventListener('message', (event) => {
  // Reject all messages except ones from https://video.example.com
  if (event.origin !== 'https://video.example.com') return;

  // Filter success messages
  if (event.data === 'succeeded') {
    // DOM manipulation is succeeded
  }
});

https://video.example.com এ:

// Receive messages
window.addEventListener('message', (event) => {
  // Reject all messages except ones from https://parent.example.com
  if (event.origin !== 'https://parent.example.com') return;

  // Do a DOM manipulation on https://video.example.com.

  // Send a success message to https://parent.example.com
  event.source.postMessage('succeeded', event.origin);
});

এটি ব্যবহার করে দেখুন এবং দেখুন এটি কীভাবে কাজ করে। যদি আপনার এমন কোনো নির্দিষ্ট প্রয়োজন থাকে যা postMessage() বা Channel Messaging API-এর মাধ্যমে কাজ করবে না, তবে Twitter-এ @ChromiumDev-এর মাধ্যমে আমাদের জানান অথবা document.domain ট্যাগ ব্যবহার করে Stack Overflow-তে জিজ্ঞাসা করুন।

শেষ উপায় হিসেবে, Origin-Agent-Cluster: ?0 হেডারটি পাঠান।

document.domain সেট করা চালিয়ে যাওয়ার জন্য আপনার কাছে যদি জোরালো কারণ থাকে, তাহলে আপনি টার্গেট ডকুমেন্টটির সাথে Origin-Agent-Cluster: ?0 রেসপন্স হেডারটি পাঠাতে পারেন।

Origin-Agent-Cluster: ?0

Origin-Agent-Cluster হেডারটি ব্রাউজারকে নির্দেশ দেয় যে ডকুমেন্টটি অরিজিন-কীড এজেন্ট ক্লাস্টার দ্বারা হ্যান্ডেল করা হবে কি না। Origin-Agent-Cluster সম্পর্কে আরও জানতে, “Requesting performance isolation with the Origin-Agent-Cluster header” পড়ুন।

আপনি এই হেডারটি পাঠালে, আপনার ডকুমেন্ট ডিফল্টরূপে অপরিবর্তনীয় হয়ে যাওয়ার পরেও document.domain সেট করা চালিয়ে যেতে পারে।

অন্য সকল ডকুমেন্ট যেগুলোর জন্য এই আচরণটি প্রয়োজন, সেগুলোকেও একটি Origin-Agent-Cluster পাঠাতে হবে (উল্লেখ্য যে, যদি শুধুমাত্র একটি ডকুমেন্ট এটি সেট করে, তাহলে document.domain কোনো প্রভাব থাকবে না)।

এন্টারপ্রাইজ পলিসির জন্য OriginAgentClusterDefaultEnabled কনফিগার করুন

ঐচ্ছিকভাবে, আপনার অ্যাডমিন OriginAgentClusterDefaultEnabled পলিসিটিকে false এ কনফিগার করতে পারেন, যাতে আপনার প্রতিষ্ঠান জুড়ে থাকা ক্রোম ইনস্ট্যান্সগুলিতে document.domain ডিফল্টরূপে সেটযোগ্য হয়। আরও জানতে, Chrome Enterprise Policy List & Management | Documentation পড়ুন।

সম্পদ

কৃতজ্ঞতা স্বীকার

আনস্প্ল্যাশে ফিনান আকবরের ছবি