কেন আপনার "ক্রস-অরিজিন আইসোলেটেড" শক্তিশালী বৈশিষ্ট্যের জন্য

প্রকাশিত: ৪ মে, ২০২০

“COOP এবং COEP ব্যবহার করে আপনার ওয়েবসাইটকে ‘ক্রস-অরিজিন আইসোলেটেড’ করা” শীর্ষক লেখায় আমরা ব্যাখ্যা করেছি কিভাবে COOP এবং COEP ব্যবহার করে ‘ক্রস-অরিজিন আইসোলেটেড’ অবস্থা গ্রহণ করতে হয়। এটি একটি সহায়ক নিবন্ধ যা ব্যাখ্যা করে কেন ব্রাউজারে শক্তিশালী বৈশিষ্ট্যগুলি সক্ষম করার জন্য ক্রস-অরিজিন আইসোলেশন প্রয়োজন।

শব্দকোষ

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

পটভূমি

ওয়েব ‘সেম-অরিজিন পলিসি’র উপর ভিত্তি করে নির্মিত, যা একটি নিরাপত্তা বৈশিষ্ট্য এবং এটি ডকুমেন্ট ও স্ক্রিপ্ট কীভাবে অন্য অরিজিনের রিসোর্সের সাথে যোগাযোগ করতে পারে তা সীমাবদ্ধ করে। এই নীতিটি ওয়েবসাইটগুলোর ক্রস-অরিজিন রিসোর্স অ্যাক্সেস করার পদ্ধতিকে সীমিত করে। উদাহরণস্বরূপ, https://a.example থেকে আসা কোনো ডকুমেন্টকে https://b.example এ হোস্ট করা ডেটা অ্যাক্সেস করতে বাধা দেওয়া হয়।

তবে, একই-উৎস নীতির কিছু ঐতিহাসিক ব্যতিক্রম রয়েছে। যেকোনো ওয়েবসাইট পারে:

  • ক্রস-অরিজিন আইফ্রেম এম্বেড করুন
  • ছবি বা স্ক্রিপ্টের মতো বিভিন্ন উৎস থেকে প্রাপ্ত রিসোর্স অন্তর্ভুক্ত করুন।
  • DOM রেফারেন্স সহ ক্রস-অরিজিন ডায়ালগ উইন্ডো খুলুন

ওয়েব কমিউনিটি কঠোর সেম-অরিজিন নীতির সুবিধাগুলো উপলব্ধি করার আগেই, ওয়েব জগৎ ইতোমধ্যে এই ব্যতিক্রমগুলোর ওপর নির্ভরশীল হয়ে পড়েছিল।

এই ধরনের শিথিল সেম-অরিজিন নীতির নিরাপত্তাজনিত পার্শ্বপ্রতিক্রিয়া দুটি উপায়ে সমাধান করা হয়েছিল:

  • ক্রস অরিজিন রিসোর্স শেয়ারিং (CORS) প্রোটোকল নিশ্চিত করে যে সার্ভারটি একটি নির্দিষ্ট অরিজিনের সাথে কোনো রিসোর্স শেয়ার করার অনুমতি দেয়।
  • ডেভেলপাররা ব্যাকওয়ার্ড কম্প্যাটিবিলিটি বজায় রেখে পরোক্ষভাবে ক্রস-অরিজিন রিসোর্সগুলিতে স্ক্রিপ্টের সরাসরি অ্যাক্সেস বন্ধ করে দেন। এই ধরনের ক্রস-অরিজিন রিসোর্সগুলিকে "ওপেক" রিসোর্স বলা হয়। এই কারণেই ইমেজে CORS প্রয়োগ না করা হলে CanvasRenderingContext2D দিয়ে ক্রস-অরিজিন পিক্সেল ম্যানিপুলেশন ব্যর্থ হয়।

এই সমস্ত নীতিগত সিদ্ধান্ত একটি ব্রাউজিং কনটেক্সট গ্রুপের মধ্যে নেওয়া হচ্ছে।

ব্রাউজিং কনটেক্সট গ্রুপে মূল সাইট এবং এমবেডেড সাইটের অ্যাসেটসমূহ অন্তর্ভুক্ত থাকে।

দীর্ঘদিন ধরে, এই সংমিশ্রণটি ব্রাউজারগুলিকে সুরক্ষিত রাখার জন্য যথেষ্ট ছিল, তবে কিছু ব্যতিক্রমী ক্ষেত্রে সরাসরি প্যাচিংয়ের প্রয়োজন হতো (যেমন JSON দুর্বলতা )।

Spectre- এর মাধ্যমে এই পরিস্থিতি বদলে গেছে, যা আপনার কোডের সাথে একই ব্রাউজিং কনটেক্সট গ্রুপে লোড হওয়া যেকোনো ডেটাকে সম্ভাব্য পাঠযোগ্য করে তোলে। নির্দিষ্ট কিছু অপারেশনের সময় পরিমাপ করে, আক্রমণকারীরা সিপিইউ ক্যাশের বিষয়বস্তু এবং ফলস্বরূপ প্রসেসের মেমরির বিষয়বস্তু অনুমান করতে পারে। প্ল্যাটফর্মে বিদ্যমান লো-গ্র্যানুলারিটি টাইমারগুলির মাধ্যমে এই ধরনের আক্রমণ সম্ভব, এবং হাই-গ্র্যানুলারিটি টাইমার, যেমন এক্সপ্লিসিট ( performance.now() এর মতো) এবং ইমপ্লিসিট ( SharedArrayBuffer এর মতো) উভয় প্রকারের টাইমার ব্যবহার করে এর গতি বাড়ানো যেতে পারে।

যদি evil.com বিভিন্ন উৎস থেকে আসা কোনো ছবি এমবেড করে, তবে তারা স্পেকটার অ্যাটাক ব্যবহার করে এমবেড করা ছবিটির পিক্সেল ডেটা পড়ে নিতে পারে। এর ফলে ‘অস্বচ্ছতা’র ওপর নির্ভরশীল সুরক্ষা ব্যবস্থাগুলো অকার্যকর হয়ে পড়ে।

Evil.com হলো মূল ওয়েবসাইট, যা Spectre ব্যবহার করে এমবেডেড b.example আইফ্রেম এবং ছবিগুলোতে আক্রমণ করে।

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

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

ক্রস অরিজিন এমবেডার নীতি

ক্রস অরিজিন এমবেডার পলিসি (COEP) একটি ডকুমেন্টকে এমন কোনো ক্রস-অরিজিন রিসোর্স লোড করা থেকে বিরত রাখে, যেগুলোর জন্য ডকুমেন্টটিকে CORP বা CORS-এর মাধ্যমে সুস্পষ্টভাবে অনুমতি দেওয়া হয়নি। এই ফিচারের মাধ্যমে, আপনি ঘোষণা করতে পারেন যে একটি ডকুমেন্ট এই ধরনের রিসোর্স লোড করতে পারবে না।

কর্পোরেট নীতিমালার কারণে কোন অন্তর্নিহিত সম্পদগুলো অনুমোদিত এবং কোনগুলো নয়, তার একটি চিত্র।
মূল সাইট, a.example , তার COEP পলিসি require-corp হিসেবে সেট করেছে। a.example b.example থেকে ৩টি অ্যাসেট এমবেড করতে চায়, কিন্তু মাত্র দুটি সফল হয়। সফল এমবেড দুটির মধ্যে রয়েছে একটি জাভাস্ক্রিপ্ট ফাইল, যেটিতে ক্রস-অরিজিন CORP পলিসি রয়েছে এবং একটি ছবি, যেটিতে CORS অনুমোদিত। তৃতীয় অ্যাসেটটি একটি ভিডিও, যার CORP পলিসি অনুযায়ী অ্যাসেটটি শুধুমাত্র সেম-অরিজিনে এমবেড করা যাবে, তাই ভিডিওটি a.example এ লোড হবে না।

এই পলিসিটি সক্রিয় করতে, ডকুমেন্টটিতে নিম্নলিখিত HTTP হেডারটি যুক্ত করুন:

Cross-Origin-Embedder-Policy: require-corp

COEP-এর একটিমাত্র মান হলো require-corp । এটি এই নীতিটি প্রয়োগ করে যে, ডকুমেন্টটি শুধুমাত্র একই অরিজিন থেকে রিসোর্স লোড করতে পারবে, অথবা অন্য কোনো অরিজিন থেকে লোডযোগ্য হিসেবে স্পষ্টভাবে চিহ্নিত রিসোর্স লোড করতে পারবে।

অন্য অরিজিন থেকে রিসোর্স লোড করার জন্য, সেগুলোকে অবশ্যই ক্রস অরিজিন রিসোর্স শেয়ারিং (CORS) অথবা ক্রস অরিজিন রিসোর্স পলিসি (CORP) সমর্থন করতে হবে।

ক্রস অরিজিন রিসোর্স শেয়ারিং

যদি কোনো ক্রস অরিজিন রিসোর্স ক্রস অরিজিন রিসোর্স শেয়ারিং (CORS) সমর্থন করে, তাহলে আপনি COEP দ্বারা বাধাপ্রাপ্ত না হয়েই আপনার ওয়েব পেজে সেটি লোড করার জন্য crossorigin অ্যাট্রিবিউট ব্যবহার করতে পারেন।

<img src="https://third-party.example.com/image.jpg" crossorigin>

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

একইভাবে, আপনি fetch() মেথডের মাধ্যমে ক্রস-অরিজিন ডেটা ফেচ করতে পারেন, যার জন্য কোনো বিশেষ ব্যবস্থাপনার প্রয়োজন হয় না, যতক্ষণ পর্যন্ত সার্ভার সঠিক HTTP হেডারসহ সাড়া দেয়।

ক্রস অরিজিন রিসোর্স পলিসি

ক্রস অরিজিন রিসোর্স পলিসি (CORP) মূলত আপনার রিসোর্সগুলোকে অন্য কোনো অরিজিন দ্বারা লোড হওয়া থেকে রক্ষা করার জন্য একটি ঐচ্ছিক ব্যবস্থা হিসেবে চালু করা হয়েছিল। COEP-এর প্রেক্ষাপটে, CORP নির্দিষ্ট করে দিতে পারে যে, কে একটি রিসোর্স লোড করতে পারবে সে বিষয়ে রিসোর্স মালিকের নীতি কী।

Cross-Origin-Resource-Policy হেডারটির তিনটি সম্ভাব্য মান রয়েছে:

Cross-Origin-Resource-Policy: same-site

যেসব রিসোর্সকে same-site হিসেবে চিহ্নিত করা হয়েছে, সেগুলো শুধুমাত্র একই সাইট থেকে লোড করা যাবে।

Cross-Origin-Resource-Policy: same-origin

যেসব রিসোর্সকে same-origin হিসেবে চিহ্নিত করা হয়েছে, সেগুলো শুধুমাত্র একই অরিজিন থেকে লোড করা যাবে।

Cross-Origin-Resource-Policy: cross-origin

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

ক্রস অরিজিন ওপেনার নীতি

ক্রস অরিজিন ওপেনার পলিসি (COOP) আপনাকে একটি টপ-লেভেল উইন্ডোকে অন্যান্য ডকুমেন্ট থেকে আলাদা করতে দেয়, ডকুমেন্টগুলোকে একটি পৃথক ব্রাউজিং কনটেক্সট গ্রুপে রাখার মাধ্যমে। এইভাবে, ডকুমেন্টগুলো সরাসরি টপ-লেভেল উইন্ডোটির সাথে ইন্টারঅ্যাক্ট করতে পারে না। উদাহরণস্বরূপ, যদি COOP সহ একটি ডকুমেন্ট একটি ডায়ালগ খোলে, তাহলে এর window.opener প্রপার্টি null হয়। ওপেনারের রেফারেন্সের .closed প্রপার্টি true হয়।

a.example একটি ডায়ালগে b.example খুলতে পারেনি।

Cross-Origin-Opener-Policy হেডারটির তিনটি সম্ভাব্য মান রয়েছে:

Cross-Origin-Opener-Policy: same-origin

যেসব ডকুমেন্টকে same-origin হিসেবে চিহ্নিত করা হয়েছে, সেগুলো সেইসব ‘same-origin’ ডকুমেন্টের সাথে একই ব্রাউজিং কনটেক্সট গ্রুপ শেয়ার করতে পারে, যেগুলোকেও স্পষ্টভাবে same-origin হিসেবে চিহ্নিত করা হয়েছে।

এমন একটি উইন্ডোর চিত্র যা একই ব্রাউজিং কনটেক্সট গ্রুপের মধ্যে থাকা 'সেম-অরিজিন' পপআপের সাথে ইন্টারঅ্যাক্ট করতে পারে, কিন্তু ব্রাউজিং কনটেক্সট গ্রুপের বাইরে থাকাকালীন 'সেম-অরিজিন' হিসেবে লেবেলযুক্ত কোনো পপআপের সাথে পারে না।

Cross-Origin-Opener-Policy: same-origin-allow-popups

same-origin-allow-popups সহ একটি শীর্ষ-স্তরের ডকুমেন্ট তার সেই সমস্ত পপআপের রেফারেন্স ধরে রাখে যেগুলি হয় COOP সেট করে না অথবা unsafe-none COOP সেট করে আইসোলেশন থেকে বেরিয়ে আসে।

সমবায়

Cross-Origin-Opener-Policy: unsafe-none

unsafe-none হলো ডিফল্ট বিকল্প এবং এটি ডকুমেন্টটিকে তার ওপেনারের ব্রাউজিং কনটেক্সট গ্রুপে যুক্ত করার অনুমতি দেয়, যদি না ওপেনারটির নিজের same-origin COOP থাকে।

সারসংক্ষেপ

আপনি যদি SharedArrayBuffer , performance.measureUserAgentSpecificMemory() , বা আরও ভালো নির্ভুলতার সাথে উচ্চ রেজোলিউশনের টাইমারের মতো ফিচারগুলো ব্যবহার করতে চান, তাহলে আপনার ডকুমেন্টে require-corp ভ্যালু সহ COEP এবং same-origin ভ্যালু সহ COOP উভয়ই ব্যবহার করতে হবে। এগুলোর কোনো একটির অনুপস্থিতিতে, ব্রাউজার ঐ শক্তিশালী ফিচারগুলোকে নিরাপদে চালু করার জন্য পর্যাপ্ত আইসোলেশনের নিশ্চয়তা দেবে না। self.crossOriginIsolated true রিটার্ন করছে কিনা তা পরীক্ষা করে আপনি আপনার পেজের পরিস্থিতি নির্ধারণ করতে পারেন।

COOP এবং COEP ব্যবহার করে আপনার ওয়েবসাইটকে 'ক্রস-অরিজিন আইসোলেটেড' করার মাধ্যমে এটি কীভাবে বাস্তবায়ন করতে হয় তা জানুন।

সম্পদ