Document.domain = document.domain क्या करता है?


90

ऑर्बिटेड (एक धूमकेतु सर्वर) के क्लाइंट-साइड जेएस घटक , के लिए आवश्यक है कि यदि सर्वर जेएस स्वयं के लिए एक अलग डोमेन या पोर्ट पर चल रहा है, तो आपको निष्पादित करना होगा

document.domain = document.domain;

इससे पहले कि कोई अन्य JS लोड हो। ( प्रलेखन देखें ।)

यह क्या करता है? यह एक NOOP की तरह लग रहा है! (मैंने जाँच की है और यह वास्तव में आवश्यक है।)

जवाबों:


203

मैंने वास्तव में यह कोड लिखा था।

क्रॉस-सबडोमेन / पोर्ट धूमकेतु करने की कोशिश करते समय, iframe document.domainको मूल फ्रेम के समान मूल्य की आवश्यकता होती है । दुर्भाग्य से, ब्राउज़र मूल नाम के लिए डोमेन नाम और पोर्ट को आंतरिक रूप से संग्रहीत करता है document.domain। लेकिन जावास्क्रिप्ट में गेट्टर और सेटर बंदरगाह के बारे में कुछ भी नहीं जानता है। तो समस्या यह है: यदि शीर्ष फ्रेम document.domainहै ('example.com', 80), और निचला फ्रेम है ('comet.example.com', 80), तो आप नीचे के फ्रेम को कैसे प्राप्त ('example.com', 80)करेंगे?

होस्टनाम भाग को बदलते समय आप पोर्ट को सेट करने के लिए जरूरी नहीं nullकर सकते हैं, इसलिए आप जो सबसे अच्छा कर सकते हैं वह ('example.com', null)नीचे के फ्रेम में है। तो शीर्ष फ्रेम को भी उस मूल्य पर सेट करना होगा, और सेटिंग document.domain=document.domainबस यही करता है। यह ब्राउज़र में आंतरिक प्रतिनिधित्व को बदलता ('example.com', 80)है ('example.com', null)और फिर सब कुछ मेल खाता है और क्रॉस-पोर्ट / सबडोमेन फ्रेम संचार काम करता है।


इस समाधान ने दुर्भाग्य से मेरे लिए काम नहीं किया है (देखें stackoverflow.com/questions/7796767/… जानकारी के लिए)। सभी फ़्रेमों में 'document.domain = document.domain' जोड़ना Chrome का व्यवहार नहीं बदलता है। कोई विचार?
स्टीफन ग्रॉस

इसके अलावा, मुझे पता चला कि अगर मैं अपने js के लिए देरी निर्धारित करता हूं, तो मुझे कम से कम दोनों फ्रेम के लिए मान्य-दिखने वाले URL मिलते हैं। फिर भी, हालांकि, एक फ्रेम दूसरे तक नहीं पहुंच सकता है।
स्टीफन ग्रॉस

6
MDN पर अजीब "छुपा" पोर्ट कैसे काम करता है, इसका एक और विवरण है: developer.mozilla.org/en/Same_origin_policy_for_JavaScript
mjs

1
आह, तो आप कोड के इस infuriating बिट के लिए दोषी हैं। उक्त लाइन के लिए धन्यवाद, इसे चलाने के बाद (और डॉक्यूमेंट.डोमेन सेट) किसी भी गतिशील रूप से निर्मित iframe को क्रॉस-डोमेन के रूप में सेट किया गया है और इस प्रकार नए बनाए गए iframe को अब एक्सेस नहीं किया जा सकता है। : /
तृष्णा

@mjs हाँ: पोर्ट नंबर को ब्राउज़र द्वारा अलग रखा जाता है। सेटर को कोई भी कॉल, जिसमें document.domain = document.domain शामिल है, पोर्ट संख्या को शून्य से अधिलेखित करने का कारण बनता है। इसलिए पहले में केवल document.domain = "company.com" सेट करके company.com:8080 पर company.com से बात नहीं की जा सकती। इसे दोनों में सेट करना होगा ताकि पोर्ट नंबर दोनों शून्य हो।
रॉय नमिर

38

ब्राउज़र स्पष्ट रूप से सेट नहीं होने पर (a) document.domain के बीच अंतर करते हैं और (b) document.domain स्पष्ट रूप से सेट होने पर ... भले ही वे समान मान लौटाते हों।

मूल्य को स्पष्ट रूप से निर्धारित करना एक अन्य उपडोमेन (एक ही मूल डोमेन के तहत) पर एक स्क्रिप्ट के साथ "सहयोग" करने के इरादे को इंगित करता है।

यदि कोई मूल पृष्ठ और बाहरी स्क्रिप्ट दोनों एक ही मान के लिए document.domain सेट करते हैं, तो एक ही मूल नीति प्रतिबंध को दरकिनार किया जा सकता है और प्रत्येक स्क्रिप्ट सभी (अन्यथा प्रतिबंधित) वस्तुओं और एक दूसरे के संदर्भों के गुणों तक पहुंच सकती है।


9

मुझे इस साइट पर निम्नलिखित जानकारी मिली: देवगुरु । अधिक संक्षेप में, यहाँ बोली है:

यह प्रॉपर्टी उस सर्वर का डोमेन नाम सेट या रिटर्न करती है जिससे दस्तावेज़ उत्पन्न हुआ था। यह उस सर्वर के डोमेन नाम को डिफॉल्ट करता है जिसे दस्तावेज़ से पुनर्प्राप्त किया गया था, लेकिन इस नाम के एक प्रत्यय (और केवल एक प्रत्यय) में बदला जा सकता है। यह स्क्रिप्ट के गुणों, सुरक्षा की अनुमति, विभिन्न सर्वरों से वितरित दस्तावेजों के बीच प्रदान करने की अनुमति देता है, बशर्ते वे एक ही डोमेन प्रत्यय साझा करते हैं।

यह मुझे लगता है कि यह एक ही डोमेन के लिए क्रॉस साइट स्क्रिप्टिंग की अनुमति देता है (भले ही उपडोमेन अलग हो)।

मुझे लगता है कि यदि आप document.domain को नहीं छूते हैं, तो js इंजन केवल उसी डोमेन से अन्य javascripts की अनुमति देता है। उस संपत्ति के साथ, आप अन्य उप-डोमेन जैसे ऑर्बिटेड डॉक्स स्टेट पर तैनात कर पाएंगे ।


6
यही कारण है कि स्पष्ट नहीं होता क्यों document.domain = document.domainहै नहीं एक NOOP।
क्रिसेंट फ्रेश

1
बस एक जंगली अनुमान है, लेकिन जैसा मैंने कहा कि मुझे लगता है कि संपत्ति केवल तभी ट्रिगर होती है जब यह एक मूल्य पर सेट होता है।
मिगेल पिंग

6

document.domainयदि स्पष्ट रूप से सेट नहीं वास्तविक URL से एक डिफ़ॉल्ट खींचती है। यदि ब्राउज़र document.domainURL से डिफ़ॉल्ट के रूप में आया है या यदि यह स्पष्ट रूप से सेट किया गया है तो ब्राउजर रिकॉर्ड करेगा । दोनों को एक ही डोमेन के लिए डिफ़ॉल्ट होना चाहिए या दोनों को काम करने के लिए स्पष्ट रूप से एक ही डोमेन पर सेट होना चाहिए। यदि कोई डिफ़ॉल्ट है और एक स्पष्ट रूप से सेट है, तो यदि पढ़ा जाता है, तो दोनों मेल खाते हैं, फिर भी दोनों पृष्ठ एक दूसरे के साथ बात करने से मना किए जाएंगे।

देखें: https://developer.mozilla.org/en-US/docs/DOM/document.domain

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.