समान-मूल नीति
यदि आप जावास्क्रिप्ट का उपयोग करते हुए विभिन्न मूल के साथ प्रवेश नहीं कर सकते हैं<iframe>
, तो यह एक बड़ी सुरक्षा दोष होगा यदि आप इसे कर सकते हैं। के लिए एक ही मूल नीति ब्राउज़रों स्क्रिप्ट एक अलग मूल के साथ एक फ्रेम पर पहुँचने का प्रयास ब्लॉक ।
मूल को अलग माना जाता है यदि पते के निम्न भागों में से कम से कम एक को बनाए नहीं रखा जाता है:
<protocol>://<hostname>:<port>/...
यदि आप किसी फ़्रेम तक पहुँचना चाहते हैं, तो प्रोटोकॉल , होस्टनाम और पोर्ट आपके डोमेन के समान होने चाहिए।
नोट: इंटरनेट एक्सप्लोरर को इस नियम का कड़ाई से पालन नहीं करने के लिए जाना जाता है, विवरण के लिए यहां देखें।
उदाहरण
यहां बताया गया है कि निम्न URL तक पहुंचने का प्रयास क्या होगा http://www.example.com/home/index.html
URL RESULT
http://www.example.com/home/other.html -> Success
http://www.example.com/dir/inner/another.php -> Success
http://www.example.com:80 -> Success (default port for HTTP)
http://www.example.com:2251 -> Failure: different port
http://data.example.com/dir/other.html -> Failure: different hostname
https://www.example.com/home/index.html:80 -> Failure: different protocol
ftp://www.example.com:21 -> Failure: different protocol & port
https://google.com/search?q=james+bond -> Failure: different protocol, port & hostname
वैकल्पिक हल
भले ही समान-मूल नीति अलग-अलग मूल वाली साइटों की सामग्री तक पहुंचने से स्क्रिप्ट को रोकती है, यदि आप दोनों पृष्ठों के मालिक हैंwindow.postMessage
message
, तो आप इस समस्या का उपयोग करके और इसके संबंधित घटना को दो पृष्ठों के बीच संदेश भेजने के लिए काम कर सकते हैं , जैसे:
आपके मुख्य पृष्ठ में:
let frame = document.getElementById('your-frame-id');
frame.contentWindow.postMessage(/*any variable or object here*/, 'http://your-second-site.com');
दूसरा तर्क यह postMessage()
हो सकता '*'
है कि गंतव्य की उत्पत्ति के बारे में कोई प्राथमिकता न दी जाए। किसी भी अन्य साइट पर आपके द्वारा भेजे गए डेटा का खुलासा करने से बचने के लिए, जब भी संभव हो एक लक्ष्य उत्पत्ति प्रदान की जानी चाहिए।
आपके <iframe>
(मुख्य पृष्ठ में निहित):
window.addEventListener('message', event => {
// IMPORTANT: check the origin of the data!
if (event.origin.startsWith('http://your-first-site.com')) {
// The data was sent from your site.
// Data sent with postMessage is stored in event.data:
console.log(event.data);
} else {
// The data was NOT sent from your site!
// Be careful! Do not use it. This else branch is
// here just for clarity, you usually shouldn't need it.
return;
}
});
इस पद्धति को दोनों दिशाओं में लागू किया जा सकता है , मुख्य पृष्ठ में एक श्रोता भी बना सकता है, और फ्रेम से प्रतिक्रियाएं प्राप्त कर सकता है। एक ही तर्क को पॉप-अप में भी लागू किया जा सकता है और मूल रूप से मुख्य पृष्ठ (जैसे का उपयोग करके window.open()
) के द्वारा उत्पन्न किसी भी नई विंडो को बिना किसी अंतर के लागू किया जा सकता है।
अपने ब्राउज़र में समान-मूल नीति अक्षम करना
इस विषय के बारे में पहले से ही कुछ अच्छे उत्तर हैं (मैंने अभी उन्हें खोजा है), इसलिए, उन ब्राउज़र के लिए जहां यह संभव है, मैं सापेक्ष उत्तर को लिंक करूंगा। हालाँकि, कृपया याद रखें कि समान-मूल नीति को अक्षम करना केवल आपके ब्राउज़र को प्रभावित करेगा । इसके अलावा, समान-मूल सुरक्षा सेटिंग्स के साथ एक ब्राउज़र चलाने से कोई भी वेबसाइट क्रॉस-ऑरिजनल संसाधनों तक पहुँच को अक्षम कर देती है , इसलिए यह बहुत असुरक्षित है और अगर आपको पता नहीं है कि आप वास्तव में क्या कर रहे हैं (जैसे विकास के उद्देश्य) ।
Access-Control-Allow-Origin
केवल IHR केcanvas.drawImage
लिए लागू नहीं होता है, केवल XHRs, फ़ॉन्ट्स, WebGL और । मेरा माननाpostMessage
है कि एकमात्र विकल्प है।