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


150

वही मूल नीति

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

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

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

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


4
अच्छा विचार .. आपको अपने उदाहरणों को उत्तर में डालना चाहिए; जैसा कि यह खड़ा है, वे सवाल को
तेज करते हैं

1
आपको प्रत्येक दृष्टिकोण के लिए सुरक्षा निहितार्थों की एक सूची भी जोड़नी चाहिए। JSONP निजी डेटा के लिए अत्यधिक असुरक्षित है।
Erlend

क्‍यों बंद हुआ? यह (विकि) प्रश्न पिछले 2 वर्षों से काफी उपयोगी है। इसके अलावा, कई जवाब संदर्भ द्वारा समर्थित हैं । एक स्पष्टीकरण की सराहना की जाएगी क्योंकि एक not constructiveटैग पूरी तरह से अपर्याप्त लगता है। दोबारा खोलने के लिए वोट किया गया।
डेविड टिटारानको

जवाबों:


84

document.domainविधि

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

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

document.domain = "company.com";

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

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

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

क्रॉस-ओरिजिनल रिसोर्स शेयरिंग विधि

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

क्रॉस-ऑरिजनल रिसोर्स शेयरिंग (कोर) एक W3C वर्किंग ड्राफ्ट है जो यह परिभाषित करता है कि मूल के स्रोतों तक पहुँचने के दौरान ब्राउज़र और सर्वर को कैसे संवाद करना चाहिए। CORS के पीछे मूल विचार यह है कि अनुरोध या प्रतिक्रिया सफल या विफल हो जाए, यह निर्धारित करने के लिए ब्राउज़र और सर्वर दोनों को एक-दूसरे के बारे में पर्याप्त जानने के लिए कस्टम 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 निर्धारित करने के लिए संपत्ति के अस्तित्व की जांच करनी चाहिए कि क्या ब्राउज़र एक्सएचआर के माध्यम से कोर का समर्थन करता है। फिर आप 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, जब बुलाया जाता है, MessageEventतो लक्ष्य विंडो में भेजा जा सकता है जब किसी भी लंबित स्क्रिप्ट को पूरा किया जाना चाहिए (जैसे कि घटना हैंडलर से शेष window.postMessageइवेंट हैंडलर, पहले से लंबित टाइमआउट, आदि) को कॉल किया जाए। MessageEventप्रकार संदेश, एक है dataसंपत्ति जो करने के लिए प्रदान पहला तर्क की स्ट्रिंग मान पर सेट है window.postMessageएक, originगुण विंडो बुला में मुख्य दस्तावेज़ के मूल करने के लिए इसी window.postMessageसमय में 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;
}

ऑफ-साइट iframe को भी ठीक से ईवेंट भेजना चाहिए postMessage:

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

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

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



मुझे आशा है कि उत्तर पाने में बहुत देर नहीं होगी: केवल सवाल यह है कि क्या लोकलहोस्ट हमेशा अपवाद है? क्या यह हमेशा अनुमति नहीं है? क्या मुझे अपने लोकलहोस्ट के माध्यम से परीक्षण रोकना चाहिए?
अय्याश

1
मुझे यकीन नहीं है कि क्यों, लेकिन जब मैं सेट करता हूं: Access-Control-Allow-Origin: http://www.stackoverflow.com/इसके बजाय: Access-Control-Allow-Origin: http://www.stackoverflow.com(url के अंत में स्लैश), यह सफारी और एफएफ में काम नहीं करता है बल्कि क्रोम में काम करता है। बेशक बिना स्लैश सभी ब्राउज़रों में ठीक काम करता है।
mtfk

1
लोगों को यह बताने लायक हो सकता है कि यह postMessageविधि केवल उन्हीं ब्राउज़रों के लिए काम करती है जो इसका समर्थन करते हैं, क्योंकि यह HTML5 जोड़ है। यह प्लगइन उसके लिए खाता बनाने की कोशिश करता है। सिर्फ इसका उल्लेख इसलिए कर रहा हूं क्योंकि मैं इसे कठिन तरीके से सीख रहा हूं।
आयरनिकमफिन

41

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

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

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

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

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

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

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


17

मैं JSONP का उपयोग करता हूं।

मूल रूप से, आप जोड़ते हैं

<script src="http://..../someData.js?callback=some_func"/>

तुम्हारे पन्ने पर।

some_func () को कॉल किया जाना चाहिए ताकि आपको सूचित किया जाए कि डेटा अंदर है।


7
JSONP में दो समस्याएं हैं: ए) आप लक्ष्य डोमेन में एक स्क्रिप्ट टैग जोड़ रहे हैं। वे कुछ भी वापस भेज सकते हैं, यहां तक ​​कि नियमित जावास्क्रिप्ट (XSS हमले)। इसलिए आपको वास्तव में उन पर भरोसा करना होगा कि वे खराब सामान न करें या हैक न हो जाएं) कोई भी अन्य वेबपेज एक ही स्क्रिप्ट-टैग जोड़ सकता है, और डेटा चोरी कर सकता है, इसलिए कभी भी निजी डेटा के लिए JSONP का उपयोग न करें।
Erlend

1
@ सूचना: वेब पर दी गई किसी भी जानकारी को किसी द्वारा भी प्राप्त किया जा सकता है (जब तक कि उचित प्रमाणीकरण की आवश्यकता न हो)। उस जानकारी को कैसे प्रस्तुत किया जाता है, इसका सटीक प्रारूप यह बेहतर या बदतर नहीं बनाता है, भले ही यह JSONP न हो।
टी-बुल

2
@ टी-बुल: समस्या यह है कि JSONP के साथ उचित प्रमाणीकरण असंभव है। एक उपयोगकर्ता साइट A पर लॉग इन करता है और फिर साइट B पर जाता है, जो JSONP स्क्रिप्ट टैग का उपयोग करके A से डेटा लोड करता है। जैसा कि अच्छा और अच्छा है। तब उपयोगकर्ता को बुराई साइट सी पर जाने में धोखा दिया जाता है, जो ए से डेटा लोड करने के लिए एक JSONP स्क्रिप्ट टैग का भी उपयोग करता है, क्योंकि उपयोगकर्ता ए के साथ प्रमाणित है, सी के मालिक अब ए से उपयोगकर्ताओं के डेटा चोरी कर सकते हैं और यहां तक ​​कि अगर उपयोगकर्ता ने ए के साथ प्रमाणित करने के लिए दो कारक प्रमाणीकरण का उपयोग किया। समस्या यह है कि JSONP अत्यधिक असुरक्षित है। और JSONP प्रस्तुति नहीं है। यह असुरक्षित डेटा ट्रांसफर है।
Erlend

1
JSONP केवल HTTP GET का समर्थन करता है।
opyate

.Js फ़ाइल यह क्या दर्शाती है -> "http: //..../someData.js....I'm किसी अन्य साइट क्लाइंट-साइड से डोम को पढ़ने की कोशिश कर रहा है, और उसी-मूल नीति को दरकिनार करने की आवश्यकता है ।
CS_2013

13

AnyOrigin ने कुछ https साइटों के साथ अच्छा काम नहीं किया है, इसलिए मैंने बस एक खुला स्रोत विकल्प लिखा है जिसका नाम iforigin.org है जो https के साथ अच्छी तरह से काम करता है।

जीथब पर कोड


@DavidTitarenco - इसने मुझे पागल कर दिया और कुछ भी चीजों को समझने की कोशिश कर रहा था। सौभाग्य से मुझे एक ब्लॉग पोस्ट मिला जिसने मदद की, और अब अगले आदमी के पास एक काम करने वाली परीक्षा साइट होगी यदि उसे कभी भी इसकी आवश्यकता होती है।
ripper234

@neoascetic - उपयोग तय किया ... URL को अब एन्कोड करने की आवश्यकता है।
ripper234

12

उसी मूल नीति पर काबू पाने का सबसे हालिया तरीका, जो मैंने पाया है http://anyorigin.com/

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

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

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

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

हालाँकि इसने मुझे https साइटों के साथ कुछ समस्याएँ दीं, इसलिए नीचे मेरा खुला स्रोत विकल्प देखें: stackoverflow.com/questions/3076414/…
ripper234

13
जिसका अर्थ है कि: a) anyorigin आपके सभी डेटा को मंदिर b के माध्यम से स्थानांतरित करने में सक्षम हो जाएगा) anyorigin आपकी साइट पर XSS कर सकता है, आपकी साइट पर आपके सभी डेटा को पढ़ सकता है, और आपके उपयोगकर्ताओं को मैलवेयर वितरित कर सकता है (यदि कोई भीororin हैक किया गया है तो क्या होगा?)
Erlend

@Erlend - जो भी होororin को कांटे और अपने सर्वर पर होस्ट करें। कोड तुच्छ है इसलिए आप यह सुनिश्चित करने के लिए इसकी समीक्षा कर सकते हैं कि कोई कारनामा छिपा नहीं है।
ripper234

12

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

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


3

JSONP मन में आता है:

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


ऊपर JSONP के लिए मेरी टिप्पणी देखें। निजी डेटा के लिए एक अच्छा विकल्प नहीं है।
Erlend

1

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

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


1

खैर, मैंने इसे दरकिनार करने के लिए PHP में कर्ल का उपयोग किया। मेरे पास एक वेबसर्विस पोर्ट 82 में चल रहा है।

<?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();
}

मेरा HTML पोर्ट 80 में WAMP पर चलता है। इसलिए हम वहाँ जाते हैं, उसी मूल नीति को दरकिनार किया गया है :-)



1

यह बहुत विश्लेषण करता है कि वहाँ क्या उपलब्ध है: http://www.slideshare.net/SlexAxton/breaking-the-cross-domain-barrier

पोस्टमैसेज समाधान के लिए एक नज़र डालें:

https://github.com/chrissrogers/jquery-postmessage/blob/master/jquery.ba-postmessage.js

और थोड़ा अलग संस्करण:

https://github.com/thomassturm/ender-postmessage/blob/master/ender-postmessage.js

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