जबकि क्रॉस-साइट स्क्रिप्टिंग को आम तौर पर नकारात्मक माना जाता है, मैं कई स्थितियों में चला जाता हूं जहां यह आवश्यक है।सर्वश्रेष्ठ अभ्यास: वैध क्रॉस-साइट स्क्रिप्टिंग
मैं हाल ही में एक बहुत ही सीमित सामग्री प्रबंधन प्रणाली की सीमाओं के भीतर काम कर रहा था। मुझे पृष्ठ के भीतर डेटाबेस कोड शामिल करने की आवश्यकता थी, लेकिन होस्टिंग सर्वर के पास कुछ भी उपलब्ध नहीं था। मैंने अपने सर्वर पर कुछ नंगे-हड्डियों की स्क्रिप्ट स्थापित की, मूल रूप से यह सोचकर कि मैं सीएसएस के टेम्पलेट में सीधे अपनी स्क्रिप्ट की सामग्री आयात करने के लिए AJAX का उपयोग कर सकता हूं (इस प्रकार गतिशील छवियों, मेनू आइटम, सीएसएस, आदि को बनाए रखना)। मैं गलत था।
XMLHttpRequest
ऑब्जेक्ट्स की सीमाओं के कारण, किसी भिन्न डोमेन से सामग्री को पकड़ना संभव नहीं है। तो मैंने सोचा iFrame - भले ही मैं फ्रेम के प्रशंसक नहीं हूं, मैंने सोचा कि मैं एक फ्रेम बना सकता हूं जो सामग्री की चौड़ाई और ऊंचाई से मेल खाता है, ताकि यह मूल दिखाई दे। दोबारा, मुझे क्रॉस-साइट स्क्रिप्टिंग "सुरक्षा" द्वारा अवरुद्ध कर दिया गया था। जबकि मैं वास्तव में iFrame में एक दूरस्थ फ़ाइल लोड कर सकता था, मैं मेजबान पृष्ठ या लोड किए गए पृष्ठ के अंदर अपने आकार को संशोधित करने के लिए जावास्क्रिप्ट निष्पादित नहीं कर सका।
इस विशेष परिदृश्य में, मैं अपने सर्वर पर सबडोमेन को इंगित करने में सक्षम नहीं था। मैं भी सीएमएस सर्वर पर एक स्क्रिप्ट नहीं बना सका जो मेरे सर्वर से सामग्री प्रॉक्सी कर सकता था, इसलिए मेरा आखिरी विचार दूरस्थ जावास्क्रिप्ट का उपयोग करना था।
एक दूरस्थ जावास्क्रिप्ट काम करता है। जब उपयोगकर्ता को जावास्क्रिप्ट अक्षम किया जाता है तो यह टूट जाता है, जो नकारात्मक है; लेकिन यह काम करता है। रिमोट जावास्क्रिप्ट का उपयोग करने के साथ मुझे "समस्या" थी कि मुझे किसी भी सामग्री को आउटपुट करने के लिए जेएस फ़ंक्शन document.write()
का उपयोग करना पड़ा। कोई भी आउटपुट जो जेएस नहीं है स्क्रिप्ट त्रुटियों का कारण बनता है। प्रत्येक पंक्ति के लिए document.write()
का उपयोग करने के अलावा, आपको यह भी सुनिश्चित करना होगा कि सामग्री से बच निकला है - या फिर आप अधिक स्क्रिप्ट त्रुटियों के साथ समाप्त हो जाते हैं।
मेरे समाधान इस प्रकार थी:
मेरे स्क्रिप्ट किसी GET पैरामीटर ("पृष्ठ") प्राप्त करें और फिर फ़ाइल ({$page}.php
) के लिए देखा है, और एक चर में सामग्री पढ़ें। हालांकि, मुझे वास्तव में शामिल स्क्रिप्ट (डेटाबेस इंटरैक्शन जैसी चीजों के लिए) निष्पादित करने के लिए अजीब बफरिंग तकनीकों का उपयोग करना पड़ा था, फिर सभी आवश्यक अक्षरों से बचकर सभी लाइन ब्रेक वर्णों (\n
) की अंतिम सामग्री को पट्टी करें। अंत परिणाम यह है कि मेरी मूल स्क्रिप्ट (जो जावास्क्रिप्ट आउटपुट करती है) मेरे सर्वर पर प्रतीत होता है "मानक" स्क्रिप्ट्स और सीएमएस टेम्पलेट के भीतर प्रदर्शित करने के लिए अपने मानक आउटपुट को जावास्क्रिप्ट में परिवर्तित करती है।
हालांकि यह समाधान काम करता है, ऐसा लगता है कि एक ही चीज़ को पूरा करने का एक बेहतर तरीका हो सकता है। एक पूरी तरह से अलग डोमेन से सामग्री को शामिल करने के उद्देश्य से विशेष रूप से क्रॉस-साइट स्क्रिप्टिंग कार्य करने का सबसे अच्छा तरीका क्या है?
आप स्पष्ट # 2 कृपया चाहेंगे? 'Html' डेटा टाइप के लिए, लोड() में, jQuery XMLHttpRequest का उपयोग करता है, जो क्रॉस-साइट पर काम नहीं करता है। साथ ही, लोड() स्क्रिप्ट टैग स्ट्रिप्स। –
क्षमा करें, मेरा मतलब # 2 के लिए जेएसओएनपी http://docs.jquery.com/Release:jQuery_1.2/Ajax#Cross-Domain_getJSON_.28using_JSONP.29 का उपयोग कर रहा है –