javascript - समान मूल नीति को रोकने के तरीके




ajax same-origin-policy (8)

document.domaindocument.domain विधि

  • विधि का प्रकार: iframe

ध्यान दें कि यह एक आईफ्रेम विधि है जो वर्तमान डोमेन के प्रत्यय में document.domain का मान सेट करती है। यदि ऐसा होता है, तो छोटे डोमेन का उपयोग बाद के मूल जांच के लिए किया जाता है। उदाहरण के लिए, http://store.company.com/dir/other.html पर दस्तावेज़ में एक स्क्रिप्ट मानें निम्नलिखित कथन निष्पादित करती है:

document.domain = "company.com";

उस कथन के निष्पादन के बाद, पृष्ठ मूल जांच को http://company.com/dir/page.html पास कर देगा। हालांकि, एक ही तर्क से, company.com document.domain को अन्यcompany.com पर सेट नहीं कर सका।

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

स्रोत: https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript

क्रॉस-उत्पत्ति संसाधन साझाकरण विधि

  • विधि का प्रकार: AJAX

क्रॉस-ओरिजिनल रिसोर्स शेयरिंग (सीओआरएस) एक डब्ल्यू 3 सी वर्किंग ड्राफ्ट है जो परिभाषित करता है कि उत्पत्ति के स्रोतों तक पहुंचने पर ब्राउजर और सर्वर को कैसे संवाद करना चाहिए। सीओआरएस के पीछे मूल विचार कस्टम HTTP हेडर का उपयोग करना है ताकि ब्राउजर और सर्वर दोनों एक दूसरे के बारे में पर्याप्त जानकारी प्राप्त कर सकें ताकि यह निर्धारित किया जा सके कि अनुरोध या प्रतिक्रिया सफल हो या विफल हो।

एक साधारण अनुरोध के लिए, जो कोई भी कस्टम हेडर के साथ GET या POST का उपयोग करता है और जिसका शरीर text/plain , अनुरोध Origin नामक अतिरिक्त हेडर के साथ भेजा जाता है। मूल शीर्षलेख में अनुरोध पृष्ठ के मूल (प्रोटोकॉल, डोमेन नाम, और पोर्ट) शामिल हैं ताकि सर्वर आसानी से निर्धारित कर सके कि उसे प्रतिक्रिया देना चाहिए या नहीं। एक उदाहरण Origin हेडर इस तरह दिख सकता है:

Origin: http://www.stackoverflow.com

यदि सर्वर निर्णय लेता है कि अनुरोध की अनुमति दी जानी चाहिए, तो यह एक Access-Control-Allow-Origin हेडर भेजता है जो भेजा गया था या * यदि यह सार्वजनिक संसाधन है तो उसे वापस गूंजता है। उदाहरण के लिए:

Access-Control-Allow-Origin: http://www.stackoverflow.com

यदि यह हेडर गुम है, या उत्पत्ति मेल नहीं खाती है, तो ब्राउज़र अनुरोध को अस्वीकार करता है। यदि सब ठीक है, तो ब्राउज़र अनुरोध को संसाधित करता है। ध्यान दें कि न तो अनुरोध और न ही प्रतिक्रियाओं में कुकी जानकारी शामिल है।

मोज़िला टीम withCredentials बारे में अपनी पोस्ट में सुझाव देती है कि आपको यह निर्धारित करने के लिए कि क्या एक्सएचआर के माध्यम से withCredentials का समर्थन करता है, आपको withCredentials संपत्ति के अस्तित्व की जांच करनी चाहिए। फिर आप सभी ब्राउज़रों को कवर करने के लिए XDomainRequest ऑब्जेक्ट के अस्तित्व के साथ जोड़े को XDomainRequest सकते हैं:

function createCORSRequest(method, url){
    var xhr = new XMLHttpRequest();
    if ("withCredentials" in xhr){
        xhr.open(method, url, true);
    } else if (typeof XDomainRequest != "undefined"){
        xhr = new XDomainRequest();
        xhr.open(method, url);
    } else {
        xhr = null;
    }
    return xhr;
}

var request = createCORSRequest("get", "http://www.stackoverflow.com/");
if (request){
    request.onload = function() {
        // ...
    };
    request.onreadystatechange = handler;
    request.send();
}

ध्यान दें कि सीओआरएस विधि को काम करने के लिए, आपको किसी भी प्रकार के सर्वर हेडर मैकेनिक तक पहुंच की आवश्यकता है और किसी भी तृतीय-पक्ष संसाधन को आसानी से एक्सेस नहीं कर सकता है।

स्रोत: http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/

window.postMessage विधि

  • विधि का प्रकार: iframe

window.postMessage , जिसे कॉल किया जाता है, किसी लक्षित लंबित स्क्रिप्ट को निष्पादित किया जाना चाहिए जब किसी लंबित स्क्रिप्ट को निष्पादित किया जाना चाहिए (उदाहरण के लिए शेष ईवेंट हैंडलर यदि window.postMessage को इवेंट हैंडलर से पहले कहा जाता है, पहले से लंबित टाइमआउट इत्यादि। )। MessageEvent में टाइप संदेश है, एक data प्रॉपर्टी जो window.postMessage window.postMessage को प्रदान किए गए पहले तर्क के स्ट्रिंग मान पर सेट है, विंडो विंडो में window.postMessage को कॉल करने में मुख्य दस्तावेज़ की उत्पत्ति से संबंधित origin प्रॉपर्टी window.postMessage को बुलाया गया था, और एक source प्रॉपर्टी जो विंडो है जिसमें window.postMessage कहा जाता है।

window.postMessage उपयोग करने के लिए, एक ईवेंट श्रोता संलग्न होना चाहिए:

    // Internet Explorer
    window.attachEvent('onmessage',receiveMessage);

    // Opera/Mozilla/Webkit
    window.addEventListener("message", receiveMessage, false);

और एक प्राप्त receiveMessage समारोह घोषित किया जाना चाहिए:

function receiveMessage(event)
{
    // do something with event.data;
}

ऑफ़-साइट आईफ्रेम को पोस्ट postMessage माध्यम से ईवेंट को ठीक से भेजना होगा:

<script>window.parent.postMessage('foo','*')</script>

खिड़की में दस्तावेज़ के स्थान के बावजूद, यह संदेश भेजने के लिए, किसी भी विंडो किसी भी अन्य विंडो पर किसी भी समय इस विधि तक पहुंच सकता है। नतीजतन, संदेशों को प्राप्त करने के लिए उपयोग किए जाने वाले किसी भी ईवेंट श्रोता को मूल और संभवतः स्रोत गुणों का उपयोग करके संदेश के प्रेषक की पहचान की जांच करनी चाहिए। इसे कम नहीं किया जा सकता है: origin और संभावित source गुणों की जांच करने में विफलता क्रॉस-साइट स्क्रिप्टिंग हमलों को सक्षम बनाता है।

स्रोत: https://developer.mozilla.org/en/DOM/window.postMessage

वही मूल नीति

मैं एचटीएमएल / जेएस समान मूल नीतियों के बारे में एक समुदाय विकी बनाना चाहता था ताकि उम्मीद है कि इस विषय की खोज करने में किसी की भी मदद करें। यह SO पर सबसे अधिक खोजे जाने वाले विषयों में से एक है और इसके लिए कोई समेकित विकी नहीं है इसलिए मैं यहां जाता हूं :)

एक ही मूल नीति किसी मूल से किसी अन्य मूल से दस्तावेज़ की प्रॉपर्टी प्राप्त करने या सेट करने से लोड होने वाले दस्तावेज़ या स्क्रिप्ट को रोकती है। यह नीति नेटस्केप नेविगेटर 2.0 पर वापस सभी तरह से है।

समान मूल नीतियों के आसपास जाने के आपके कुछ पसंदीदा तरीके क्या हैं?

कृपया उदाहरण वर्बोज़ रखें और अधिमानतः अपने स्रोतों को भी लिंक करें।


रिवर्स प्रॉक्सी विधि

  • विधि का प्रकार: अजाक्स

सर्वर पर एक साधारण रिवर्स प्रॉक्सी सेट अप करने से, ब्राउज़र को अजाक्स अनुरोधों के लिए सापेक्ष पथ का उपयोग करने की अनुमति मिल जाएगी, जबकि सर्वर किसी भी दूरस्थ स्थान पर प्रॉक्सी के रूप में कार्य करेगा।

यदि अपाचे में mod_proxy का उपयोग करते हैं, तो एक रिवर्स प्रॉक्सी सेट करने के लिए मौलिक कॉन्फ़िगरेशन निर्देश प्रॉक्सीपास है। आमतौर पर इसका उपयोग निम्नानुसार किया जाता है:

ProxyPass     /ajax/     http://other-domain.com/ajax/

इस मामले में, ब्राउज़र एक सापेक्ष यूआरएल के रूप में /ajax/web_service.xml का अनुरोध करने में सक्षम होगा, लेकिन सर्वर http://other-domain.com/ajax/web_service.xml प्रॉक्सी के रूप में कार्य करके इसकी सेवा करेगा।

इस विधि की एक दिलचस्प विशेषता यह है कि रिवर्स प्रॉक्सी आसानी से एकाधिक बैक-सिरों की ओर अनुरोध वितरित कर सकती है, इस प्रकार लोड बैलेंसर के रूप में कार्य कर रही है।


खैर, मैंने इसे रोकने के लिए PHP में कर्ल का इस्तेमाल किया था। मेरे पास पोर्ट 82 में एक webservice चल रहा है।

<?php

$curl = curl_init();
$timeout = 30;
$ret = "";
$url="http://localhost:82/put_val?val=".$_GET["val"];
curl_setopt ($curl, CURLOPT_URL, $url);
curl_setopt ($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($curl, CURLOPT_MAXREDIRS, 20);
curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5");
curl_setopt ($curl, CURLOPT_CONNECTTIMEOUT, $timeout);
$text = curl_exec($curl);
echo $text;

?>

यहां जावास्क्रिप्ट है जो PHP फ़ाइल को कॉल करता है

function getdata(obj1, obj2) {

    var xmlhttp;

    if (window.XMLHttpRequest)
            xmlhttp=new XMLHttpRequest();
    else
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
                document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
        }
    }
    xmlhttp.open("GET","phpURLFile.php?eqp="+obj1+"&val="+obj2,true);
    xmlhttp.send();
}

मेरा एचटीएमएल पोर्ट 80 में डब्ल्यूएएमपी पर चलता है। तो हम वहां जाते हैं, वही मूल नीति को बाधित किया गया है :-)


मुझे मिली मूल उत्पत्ति पर काबू पाने का सबसे हालिया तरीका http://anyorigin.com/

साइट बनाई गई है ताकि आप इसे किसी भी यूआरएल दें और यह आपके लिए जावास्क्रिप्ट / jquery कोड उत्पन्न करता है जो आपको इसकी उत्पत्ति के बावजूद एचटीएमएल / डेटा प्राप्त करने देता है। दूसरे शब्दों में, यह किसी भी यूआरएल या वेबपृष्ठ को JSONP अनुरोध करता है।

मैंने इसे बहुत उपयोगी पाया है :)

यहां किसी भी उदाहरण से जावास्क्रिप्ट कोड है:

$.getJSON('http://anyorigin.com/get?url=google.com&callback=?', function(data){
    $('#output').html(data.contents);
});

मैं इस छवि के लिए क्रेडिट का दावा नहीं कर सकता, लेकिन यह इस विषय पर जो कुछ भी मुझे पता है उससे मेल खाता है और एक ही समय में थोड़ा विनोद प्रदान करता है।

http://www.flickr.com/photos/iluvrhinestones/5889370258/



व्यक्तिगत रूप से, window.postMessage सबसे विश्वसनीय तरीका है जिसे मैंने आधुनिक ब्राउज़र के लिए पाया है। यह सुनिश्चित करने के लिए आपको थोड़ा और काम करना होगा कि आप एक्सएसएस हमलों के लिए खुद को नहीं छोड़ रहे हैं, लेकिन यह एक उचित व्यापारिक है।

वहाँ लोकप्रिय जावास्क्रिप्ट टूलकिट के लिए कई प्लगइन्स भी हैं जो window.postMessage लपेटते हैं जो ऊपर चर्चा की गई अन्य विधियों का उपयोग करके पुराने ब्राउज़र को समान कार्यक्षमता प्रदान करते हैं।


JSONP दिमाग में आता है:

जेएसओएनपी या "पैडिंग के साथ जेएसओएन" आधार जेएसओएन डेटा प्रारूप का एक पूरक है, एक उपयोग पैटर्न जो पृष्ठ को अनुरोध करने की अनुमति देता है और प्राथमिक सर्वर के अलावा किसी अन्य सर्वर से जेएसओएन का अर्थपूर्ण रूप से उपयोग करता है। जेएसओएनपी क्रॉस-ओरिजिनल रिसोर्स शेयरिंग नामक एक और हालिया विधि का विकल्प है।





same-origin-policy