এই হল কিভাবে:
[ নভেম্বর 2020 আপডেট: এই সমাধানটি সেট করতে সক্ষম হওয়ার উপর নির্ভর করে document.domain
। দুর্ভাগ্যক্রমে এটি করার ক্ষমতা এখন অবমূল্যায়ন করা হয়েছে। ]
প্রদত্ত সুপারডোমেনের (যেমন উদাহরণ.কম) সাবডোমেনগুলির মধ্যে ভাগ করার জন্য, এমন একটি প্রযুক্তি আছে যা আপনি সেই পরিস্থিতিতে ব্যবহার করতে পারেন। এটা তোলে প্রয়োগ করা যেতে পারে localStorage
, IndexedDB
, SharedWorker
, BroadcastChannel
, ইত্যাদি, যার মধ্যে সব একই বংশোদ্ভূত পৃষ্ঠাগুলির মধ্যে ভাগ কার্যকারিতা প্রস্তাব, কিন্তু কোনো কারণে কোনো পরিবর্তন সম্মান না document.domain
যে তাদের সরাসরি তাদের উৎপত্তি যেমন superdomain ব্যবহার করার অনুমতি দেবে।
(1) ডেটা সম্পর্কিত হতে একটি "প্রধান" ডোমেন চয়ন করুন: যেমন https://example.com বা https://www.example.com আপনার লোকালস্টোরেজ ডেটা ধারণ করবে। ধরা যাক আপনি https://example.com চয়ন করেছেন ।
(২) সেই চয়ন করা ডোমেনের পৃষ্ঠাগুলির জন্য স্থানীয়ভাবে স্টোরেজ ব্যবহার করুন।
(3) সমস্ত https://www.example.com পৃষ্ঠাগুলিতে ( অন্যান্য ডোমেন), সেট করতে জাভাস্ক্রিপ্ট ব্যবহার করুন document.domain = "example.com";
। তারপর আরো একটি গোপন তৈরি <iframe>
, এবং এটি নেভিগেট কিছু মনোনীত পৃষ্ঠার https://example.com ডোমেইন ( এটা কোন ব্যাপার না কি পৃষ্ঠা , যতদিন আপনি সেখানে জাভাস্ক্রিপ্ট একটি খুব সামান্য স্নিপেট ঢোকাতে পারবেন। আপনি যদি ' সাইট তৈরি পুনরায় শুধু এই কাজের জন্য বিশেষভাবে একটি খালি পৃষ্ঠাটি তৈরি করুন। যদি আপনি একটি এক্সটেনশন বা একটি গ্রিজমাঙ্কি ধাঁচের userscript লেখার তাহলে ইত্যাদি পৃষ্ঠাগুলি উপর কোন নিয়ন্ত্রণ নেই example.comসার্ভার, আপনি সর্বাধিক লাইটওয়েট পৃষ্ঠা চয়ন করুন এবং এটিতে আপনার স্ক্রিপ্ট সন্নিবেশ করান। কিছু ধরণের "পাওয়া যায়নি" পৃষ্ঠাটি সম্ভবত ভাল থাকবে)।
(৪) লুকানো iframe পৃষ্ঠায় স্ক্রিপ্টের জন্য কেবলমাত্র (ক) সেট প্রয়োজন document.domain = "example.com";
, এবং (খ) এটি করা হয়ে গেলে প্যারেন্ট উইন্ডোকে অবহিত করা উচিত। এর পরে, প্যারেন্ট উইন্ডোটি কোনও বাধা ছাড়াই আইফ্রেমে উইন্ডো এবং তার সমস্ত বিষয়গুলি অ্যাক্সেস করতে পারে! তাই ন্যূনতম iframe পৃষ্ঠাটি হ'ল কিছু:
<!doctype html>
<html>
<head>
<script>
document.domain = "example.com";
window.parent.iframeReady();
</script>
</head>
<body></body>
</html>
যদি কোনও ইউজার স্ক্রিপ্ট লেখা থাকে তবে iframeReady()
আপনি আপনার মতো বহিরাগত-অ্যাক্সেসযোগ্য ফাংশনগুলি যুক্ত করতে নাও চান unsafeWindow
, সুতরাং এর পরিবর্তে মূল উইন্ডোটির ইউজার স্ক্রিপ্টকে জানানোর একটি ভাল উপায় হতে পারে একটি কাস্টম ইভেন্ট ব্যবহার করা:
window.parent.dispatchEvent(new CustomEvent("iframeReady"));
যা আপনি আপনার প্রধান পৃষ্ঠার উইন্ডোতে কাস্টম "iframeReady" ইভেন্টের জন্য শ্রোতা যুক্ত করে সনাক্ত করতে পারবেন।
(দ্রষ্টব্য: আইফ্রেমের ডোমেন ইতিমধ্যে উদাহরণ ডটকম থাকলেও আপনাকে ডকুমেন্ট.ডোমেন = "উদাহরণ.com" সেট করা দরকার: ডকুমেন্ট.ডমিনকে একটি মান নির্ধারণ করে স্পষ্টতই মূলটির পোর্টটি বাতিল করে দেয় এবং উভয় পোর্ট অবশ্যই আইফ্রেমের সাথে মেলে এবং এর পিতামাতাকে একই উত্স হিসাবে বিবেচনা করা হবে the এখানে নোটটি দেখুন: https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy#Changing_origin )
(5) একবার লুকানো আইফ্রেম তার পিতা বা মাতা উইন্ডোর এটি প্রস্তুত জানিয়েছে, পিতা বা মাতা উইন্ডোতে স্ক্রিপ্ট শুধু ব্যবহার করতে পারেন iframe.contentWindow.localStorage
, iframe.contentWindow.indexedDB
, iframe.contentWindow.BroadcastChannel
, iframe.contentWindow.SharedWorker
পরিবর্তে window.localStorage
, window.indexedDB
ইত্যাদি ... আর এই সব বস্তু scoped হবে মনোনীত HTTPS: // উদাহরণ.কমের উত্স - সুতরাং আপনার সমস্ত পৃষ্ঠার জন্য তাদের একই ভাগ করা উত্স থাকবে!
এই কৌশলটির সবচেয়ে বিশ্রী অংশটি হ'ল এগিয়ে যাওয়ার আগে আপনাকে iframe লোড হওয়ার জন্য অপেক্ষা করতে হবে। সুতরাং আপনি খুব সহজেই আপনার ডোমকন্টেন্টলয়েড হ্যান্ডলারের লোকালস্টোরেশন ব্যবহার শুরু করতে পারবেন না। এছাড়াও লুকানো iframe সঠিকভাবে লোড করতে ব্যর্থ হয় তা সনাক্ত করতে আপনি কিছু ত্রুটি পরিচালনার যোগ করতে চাইতে পারেন।
স্পষ্টতই, আপনারও নিশ্চিত হওয়া উচিত যে আপনার পৃষ্ঠার জীবদ্দশায় লুকিয়ে থাকা আইফ্রেমটি সরিয়ে নেওয়া বা নেভিগেট করা হয়নি ... OTOH এর পরিণাম কী হবে তা আমি জানি না, তবে খুব সম্ভবত খারাপ জিনিসগুলি ঘটবে।
এবং, একটি সতর্কতামূলক: হেডার ব্যবহার করে সেটিংস / পরিবর্তনটি ব্লক করা document.domain
যেতে পারে , সেক্ষেত্রে বর্ণিত হিসাবে এই কৌশলটি ব্যবহারযোগ্য হবে না।Feature-Policy
যাইহোক, এই কৌশলটির একটি উল্লেখযোগ্যভাবে আরও জটিল জেনারালাইজেশন রয়েছে, যা এটিকে অবরুদ্ধ করা যায় না Feature-Policy
এবং এটি সম্পূর্ণরূপে সম্পর্কিত নয় এমন ডোমেনগুলি ডেটা, যোগাযোগ এবং ভাগ করা কর্মীদের ভাগ করার অনুমতি দেয় (অর্থাত্ একটি সাধারণ সুপারডোমেন বন্ধ করে কেবল সাবডোমেন নয়)। @ মায়াঙ্ক জৈন ইতিমধ্যে তাদের উত্তরে এটি বর্ণনা করেছেন, যথা:
সাধারণ ধারণাটি হ'ল উপরের মতোই, আপনি অ্যাক্সেসের সঠিক উত্স প্রদান করতে একটি লুকানো ইফ্রেমে তৈরি করেছেন; কিন্তু এর পরিবর্তে তারপর আইফ্রেম উইন্ডোর বৈশিষ্ট্য সরাসরি দখলের, আপনি স্ক্রিপ্ট আইফ্রেম ভিতরে কাজ এগুলির সবকটি করতে ব্যবহার করুন, এবং আপনি আইফ্রেম এবং আপনার প্রধান উইন্ডোতে শুধুমাত্র ব্যবহার মধ্যে যোগাযোগ postMessage()
এবং addEventListener("message",...)
।
এটি কাজ করে কারণ postMessage()
বিভিন্ন উত্সের উইন্ডোর মধ্যেও ব্যবহার করা যেতে পারে। তবে এটি আরও উল্লেখযোগ্যভাবে জটিল কারণ আপনার মূল উইন্ডোর কোডটিতে সরাসরি লোকালস্টোরেজ, ইনডেক্সডডিবি, ইত্যাদি এপিআই ব্যবহার না করে আপনাকে কিছুটা মেসেজিং অবকাঠামো যা আপনি iframe এবং মূল উইন্ডোর মধ্যে তৈরি করেছেন তা দিয়ে যেতে হবে।