2013-10-30 8 views
11

मैंने पिछले 3 दिनों में XMLHttpRequest का उपयोग कर क्रॉस डोमेन अनुरोध बनाने का अध्ययन किया। सबसे अच्छा विकल्प वास्तव में जेएसओएनपी के साथ है जिसका मैं पहले से उपयोग कर रहा हूं।XMLHttpRequest वही मूल नीति

लेकिन मुझे अभी भी एक सवाल है कि मुझे कहीं भी जवाब नहीं मिला। मैंने सैकड़ों पदों को पढ़ा (एसओएस सहित) और किसी के पास कोई अच्छा उत्तरदायी उत्तर नहीं है (अच्छे संदर्भ के साथ)। उम्मीद है कि यहां कोई मदद कर सकता है।

ने कहा कि, मैंने कई वेबसाइटों में पढ़ा है कि सुरक्षा कारणों से मैं डोमेन aaa.com से bbb.com पर अजाक्स अनुरोध नहीं कर सकता और मुझे इच्छित डेटा प्राप्त नहीं कर सकता। यह बहुत स्पष्ट है और मुझे इसके बारे में कोई सवाल नहीं है। लेकिन समस्या यह है कि जब मैं अपने लोकहोस्ट में नीचे कोड चलाता हूं (इसलिए मेरा डोमेन "लोकलहोस्ट" है और मुझे किसी अन्य डोमेन से किसी भी डेटा का अनुरोध करने में सक्षम नहीं होना चाहिए)।

xhReq = new XMLHttpRequest(); 
xhReq.open("GET","http://domain.com?parameter",true); 
xhReq.send(null); 

जब मैं फायरबग नेट टैब का निरीक्षण करता हूं तो मुझे एहसास होता है कि अनुरोध अवरुद्ध नहीं था! यह स्पष्ट रूप से अनुरोध किया गया था। मैं विश्वास नही कर सकता। इसलिए मैंने domain.com/log.php में एक फ़ाइल बनाई, जहां मैं अपने डोमेन पर क्लिक करने वाले किसी भी अनुरोध को लॉग कर सकता था। आश्चर्यजनक रूप से मैं उन सभी अनुरोधों को स्थानीयहोस्ट फायर कर रहा था, जो मेरा डोमेन.com मार रहे थे। जब मैंने प्रतिक्रिया प्राप्त करने का प्रयास किया तो मैं वास्तव में इसे अपने क्रोम और FIrebug ब्राउज़र की मूल उत्पत्ति के कारण प्राप्त नहीं कर सका। लेकिन मैं वास्तव में हैरान था कि अनुरोध ने वास्तव में वेबसर्वर को मारा, हालांकि मैं जवाब में कोई बदलाव नहीं कर सका।

अधिक आश्चर्यजनक बात यह है कि यदि डोमेन.com/log.php 1 एमबी की तरह एक बड़ा प्रतिक्रिया उत्पन्न करता है तो मेरी फायरबग ने मुझे दिखाया कि ब्राउज़र वेबसर्वर से सभी 1 एमबी डाउनलोड करता है, और अंत में यह एक संदेश दिखाता है "एक्सेस अस्वीकृत " जैसा सोचा था। तो यदि सभी मूल नीति नीति को पढ़ने के लिए मना कर देती है तो सभी फाइलें डाउनलोड क्यों करें।

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

मुझे परेशान करता है कि यह एक बड़ा सुरक्षा छेद खोल सकता है, जिसमें रोज़ाना हजारों विचारों वाली एक वेबसाइट इस 3 लाइन कोड को चला सकती है और उपयोगकर्ताओं को एक अप्रासंगिक वेबसाइट में भारी डीडीओ हमले का कारण बनती है, जिससे उपयोगकर्ता अनुरोध करते हैं छोटे अंतराल में किसी अन्य वेबसाइट पर पृष्ठ क्योंकि ब्राउज़र अनुरोध को अवरुद्ध नहीं करेगा।

मैंने आईई 7, 8 और 9 में इस स्क्रिप्ट का परीक्षण किया और क्रोम नवीनतम और फ़ायरफ़ॉक्स नवीनतम और व्यवहार समान है: अनुरोध किया गया है और ब्राउजर एसओपी करने के लिए इसे उपलब्ध कराने के दौरान सभी प्रतिक्रिया डाउनलोड करता है।

आशा है कि कोई मुझे समझा सकता है कि चश्मा इसके बारे में इतना गलत क्यों हैं या मैं क्या गलत समझ रहा हूं!

+0

अच्छा सवाल है। पता नहीं क्यों अनुरोध बाहरी डोमेन मारा। मैंने यहां एक परीक्षण किया और जैसा कि आप, अनुरोध पूरा हो गया था, हालांकि मैं प्रतिक्रिया प्राप्त नहीं कर सका। उम्मीद है कि कोई मदद करता है। – amandanovaes

+0

क्या आप जांच सकते हैं कि 'domain.com' में [CORS] है (http://www.w3.org/TR/cors/) सक्षम है .... लेकिन यदि ऐसा है तो IE को काम नहीं करना चाहिए ... किसी भी तरह से आप पुष्टि कर सकते हैं –

+0

@ArunPJohny नहीं, सीओआरएस सक्षम नहीं है। यह एक उदाहरण साइट है। आप डोमेन.com को किसी भी डोमेन में बदल सकते हैं और आप फायरबग या क्रोम नेट कंसोल में देखेंगे कि अनुरोध बिना किसी त्रुटि के पूरा हो गया है। यह स्पष्ट है कि यह एक बग नहीं है क्योंकि मेरे द्वारा परीक्षण किए गए सभी ब्राउज़र एक ही तरीके से व्यवहार करते हैं, लेकिन विनिर्देश कहता है कि अनुरोध क्रॉस डोमेन AJAX अनुरोध के लिए "अवरोधित है"। – Samul

उत्तर

1

यह इसलिए होता है क्योंकि एक ही मूल नीति का पालन अभिगम नियंत्रण हैडर मूल्यांकन द्वारा ग्राहक के पक्ष (ब्राउज़र) पर लागू किया जाता मूल्यों सर्वर से लौटे:

  • पहुंच-नियंत्रण-अनुमति दें-उत्पत्ति
  • पहुंच-नियंत्रण-अनुमति दें-तरीके
  • पहुंच-नियंत्रण-अनुमति दें-हेडर

आप देख सकते हैं, अनुरोध पहले होना चाहिए ब्राउजर के बदले हेडर का निरीक्षण करने के लिए सर्वर पर पूरा किया गया। सर्वर पर आपका अनुरोध निष्पादित करने का यही कारण है।

आप Priciples of the Same-Origin Policy by A. Barth पर एक नज़र डाल सकते हैं।

1

एक समान प्रश्न पर bobince's answer देखें:

XMLHttpRequest स्तर 2 के अनुसार, ब्राउज़रों पार मूल preflighting के बिना भेजा जा करने के लिए हो जाता है की अनुमति देते हैं, लेकिन परिणाम प्रतिक्रिया से पढ़ा जा करने की अनुमति नहीं जब तक रिमोट डोमेन नहीं निकलता है। वहां कोई अतिरिक्त भेद्यता नहीं है क्योंकि आप पहले से ही URL को भेजे जाने वाले URL (क्वेरी स्ट्रिंग सहित, इसके लायक होने के लिए) को एकाधिक और अधिक बुनियादी इंटरफेस के माध्यम से प्राप्त कर सकते हैं।

उदाहरण के लिए आप हमेशा के साथ एक तत्व बनाने के लिए एक दूरस्थ डोमेन पर एक पते पर सेट करने में सक्षम रहे हैं; क्रॉस-डोमेन क्षमता को हटाकर मौजूदा वेब को तोड़ दिया जाएगा।

संबंधित:

संबंधित मुद्दे