2008-09-09 3 views
20

जबकि क्रॉस-साइट स्क्रिप्टिंग को आम तौर पर नकारात्मक माना जाता है, मैं कई स्थितियों में चला जाता हूं जहां यह आवश्यक है।सर्वश्रेष्ठ अभ्यास: वैध क्रॉस-साइट स्क्रिप्टिंग

मैं हाल ही में एक बहुत ही सीमित सामग्री प्रबंधन प्रणाली की सीमाओं के भीतर काम कर रहा था। मुझे पृष्ठ के भीतर डेटाबेस कोड शामिल करने की आवश्यकता थी, लेकिन होस्टिंग सर्वर के पास कुछ भी उपलब्ध नहीं था। मैंने अपने सर्वर पर कुछ नंगे-हड्डियों की स्क्रिप्ट स्थापित की, मूल रूप से यह सोचकर कि मैं सीएसएस के टेम्पलेट में सीधे अपनी स्क्रिप्ट की सामग्री आयात करने के लिए AJAX का उपयोग कर सकता हूं (इस प्रकार गतिशील छवियों, मेनू आइटम, सीएसएस, आदि को बनाए रखना)। मैं गलत था।

XMLHttpRequest ऑब्जेक्ट्स की सीमाओं के कारण, किसी भिन्न डोमेन से सामग्री को पकड़ना संभव नहीं है। तो मैंने सोचा iFrame - भले ही मैं फ्रेम के प्रशंसक नहीं हूं, मैंने सोचा कि मैं एक फ्रेम बना सकता हूं जो सामग्री की चौड़ाई और ऊंचाई से मेल खाता है, ताकि यह मूल दिखाई दे। दोबारा, मुझे क्रॉस-साइट स्क्रिप्टिंग "सुरक्षा" द्वारा अवरुद्ध कर दिया गया था। जबकि मैं वास्तव में iFrame में एक दूरस्थ फ़ाइल लोड कर सकता था, मैं मेजबान पृष्ठ या लोड किए गए पृष्ठ के अंदर अपने आकार को संशोधित करने के लिए जावास्क्रिप्ट निष्पादित नहीं कर सका।

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

एक दूरस्थ जावास्क्रिप्ट काम करता है। जब उपयोगकर्ता को जावास्क्रिप्ट अक्षम किया जाता है तो यह टूट जाता है, जो नकारात्मक है; लेकिन यह काम करता है। रिमोट जावास्क्रिप्ट का उपयोग करने के साथ मुझे "समस्या" थी कि मुझे किसी भी सामग्री को आउटपुट करने के लिए जेएस फ़ंक्शन document.write() का उपयोग करना पड़ा। कोई भी आउटपुट जो जेएस नहीं है स्क्रिप्ट त्रुटियों का कारण बनता है। प्रत्येक पंक्ति के लिए document.write() का उपयोग करने के अलावा, आपको यह भी सुनिश्चित करना होगा कि सामग्री से बच निकला है - या फिर आप अधिक स्क्रिप्ट त्रुटियों के साथ समाप्त हो जाते हैं।

मेरे समाधान इस प्रकार थी:

मेरे स्क्रिप्ट किसी GET पैरामीटर ("पृष्ठ") प्राप्त करें और फिर फ़ाइल ({$page}.php) के लिए देखा है, और एक चर में सामग्री पढ़ें। हालांकि, मुझे वास्तव में शामिल स्क्रिप्ट (डेटाबेस इंटरैक्शन जैसी चीजों के लिए) निष्पादित करने के लिए अजीब बफरिंग तकनीकों का उपयोग करना पड़ा था, फिर सभी आवश्यक अक्षरों से बचकर सभी लाइन ब्रेक वर्णों (\n) की अंतिम सामग्री को पट्टी करें। अंत परिणाम यह है कि मेरी मूल स्क्रिप्ट (जो जावास्क्रिप्ट आउटपुट करती है) मेरे सर्वर पर प्रतीत होता है "मानक" स्क्रिप्ट्स और सीएमएस टेम्पलेट के भीतर प्रदर्शित करने के लिए अपने मानक आउटपुट को जावास्क्रिप्ट में परिवर्तित करती है।

हालांकि यह समाधान काम करता है, ऐसा लगता है कि एक ही चीज़ को पूरा करने का एक बेहतर तरीका हो सकता है। एक पूरी तरह से अलग डोमेन से सामग्री को शामिल करने के उद्देश्य से विशेष रूप से क्रॉस-साइट स्क्रिप्टिंग कार्य करने का सबसे अच्छा तरीका क्या है?

उत्तर

14

आप तीन विकल्प मिल गया है:

  1. एक server side proxy script बनाएँ।
  2. दूरस्थ गतिशील HTML में पढ़ने के लिए एक दूरस्थ स्क्रिप्ट बनाएं। इसे आसान बनाने के लिए jQuery जैसी लाइब्रेरी का उपयोग करें। जहां आवश्यक हो वहां HTML को इंजेक्ट करने के लिए आप load function का उपयोग कर सकते हैं। EDIT उदाहरण के लिए मैं मूल रूप से क्या मतलब था #का उपयोग कर रहा था, जिसके लिए सर्वर साइड स्क्रिप्ट को "कॉलबैक =" पहचानने की आवश्यकता होती है। परम।

  3. client side Flash proxy का उपयोग करें और अपने सर्वर की वेब रूट पर crossdomain.xml फ़ाइल सेट करें।

+0

आप स्पष्ट # 2 कृपया चाहेंगे? 'Html' डेटा टाइप के लिए, लोड() में, jQuery XMLHttpRequest का उपयोग करता है, जो क्रॉस-साइट पर काम नहीं करता है। साथ ही, लोड() स्क्रिप्ट टैग स्ट्रिप्स। –

+0

क्षमा करें, मेरा मतलब # 2 के लिए जेएसओएनपी http://docs.jquery.com/Release:jQuery_1.2/Ajax#Cross-Domain_getJSON_.28using_JSONP.29 का उपयोग कर रहा है –

1

व्यक्तिगत रूप से, मैं सर्वर पर सर्वर पर कॉल करता हूं और अपने पृष्ठ में उपयोग के लिए डेटा प्राप्त और पार्स करता हूं। इस तरह आप किसी भी समस्या से बचते हैं और आपको डेटा प्राप्त करने और विश्लेषण करने के लिए सर्वर-साइड भाषा/प्लेटफ़ॉर्म की शक्ति मिलती है।

सुनिश्चित नहीं हैं कि अगर अपने विशिष्ट परिदृश्य के लिए काम करेगा ... यहां तक ​​कि अपने वर्बोज़ विवरण के साथ पता करने के लिए कठिन ...

0

मैं उस YDN server side proxy script से पहले आया हूं। यह कहता है कि यह याहू के खोज एपीआई के साथ काम करने के लिए बनाया गया है।

क्या यह किसी भी डोमेन के साथ काम करेगा, अगर आप याहू एपीआई कोड को आसानी से ट्रिम करते हैं? या क्या आपको इसे उस डोमेन से प्रतिस्थापित करने की आवश्यकता है जिसके साथ आप काम करना चाहते हैं?

1

आप बहुत कम कोड सहित easyXDM को आजमा सकते हैं, आप विभिन्न डोमेन के दस्तावेज़ों के बीच डेटा या विधि कॉल पास कर सकते हैं।

0

iframe रिमोट सामग्री को स्थानीय जावास्क्रिप्ट द्वारा एक्सेस किया जा सकता है।

दूरस्थ सर्वर को केवल पृष्ठ के document.domain सेट करना होगा।

उदाहरण के लिए:

साइट एक साथ src='Site B/home.php'

home.php एक iframe शामिल इस तरह दिखता है:

[php stuff]...[/php] 
[script type='text/javascript']document.domain='Site A'[/script]