2009-08-02 16 views
10

यह विचित्र है, मैं सोच रहा था कि अगर किसी को भी इस क्यों हुआ पर कुछ प्रकाश डाला सकता है पर चल निष्पादित नहीं करता है।JSONP कॉलबैक जब स्थानीय होस्ट

असल में, मैं JSONP का परीक्षण करना तो मैं एक JSON वेब सेवा अन्य साइटों का उपयोग कर सकते लागू कर सकते हैं की कोशिश कर बाहर मेरे बाल खींच रहा है। मैं लोकलहोस्ट पर विकास कर रहा हूं - विशेष रूप से, विजुअल स्टूडियो 2008 और विजुअल स्टूडियो 2008 के अंतर्निर्मित वेब सर्वर।

तो एक JSONP परीक्षण चालन डब्ल्यू/jQuery के रूप में, मैं निम्नलिखित कार्यान्वित:

$().ready(function() { 
    debugger; 
    try { 
    $.getJSON("<%= new Uri(Request.Url, "/").ToString() %>XssTest?callback=?", function(data) { 
     alert(data.abc); 
    }); 
    } catch (err) { 
    alert(err); 
    } 
}); 

और सर्वर पर ..

<%= Request["callback"] %>({abc : 'def'}) 

तो क्या हो रहा समाप्त होता है मैं पर एक ब्रेकपाइंट सेट सर्वर और मुझे पहले "डीबगर" पर ब्रेकपॉइंट मिलता है; क्लाइंट-साइड स्क्रिप्ट के साथ-साथ सर्वर पर भी स्टेटमेंट। पेज लोड के बाद JSONP यूआरएल वास्तव में लागू किया जा रहा है। यह बहुत अच्छा काम कर रहा है।

मेरी समस्या यह थी कि कॉलबैक कभी निष्पादित नहीं होगा। मैंने आईई 8 के साथ-साथ फ़ायरफ़ॉक्स 3.5 में इसका परीक्षण किया। कोई भी कॉलबैक का आह्वान नहीं करेगा। पकड़ (गलती) कभी नहीं पहुंची थी, या तो। कुछ भी नहीं हुआ!

मैं एक सप्ताह के लिए इस पर अटक कर रहा था, और यहां तक ​​कि एक मैन्युअल रूप से बंद HTTP सुनिश्चित करें कि सर्वर प्रारूप लौटा रहा है होने के लिए निर्दिष्ट पोर्ट पर टेलनेट में अनुरोध के साथ परीक्षण किया ...

callbackfn({abc : 'def'}) 

.. और यह है।

फिर यह मुझ पर लगा, क्या एक globalizer साथ स्थानीय होस्ट करने के लिए अगर मैं स्थानीय होस्ट से होस्ट नाम बदलने ('।'), यानी http://localhost:41559/ के बजाय http://localhost.:41559/ (हाँ, किसी भी होस्ट नाम के लिए एक बिंदु जोड़ने, कानूनी है यह DNS करने के लिए है global:: सी # नामस्थानों के लिए है)। और फिर यह काम किया! इंटरनेट एक्सप्लोरर और फ़ायरफ़ॉक्स 3.5 ने अंत में मुझे एक चेतावनी संदेश दिखाया जब मैंने अभी एक डॉट जोड़ा।

तो इससे मुझे आश्चर्य होता है, यहां क्या हो रहा है? देर से लिपि टैग पीढ़ी इंटरनेट होस्टनाम के साथ क्यों काम करेगी, न कि स्थानीय लोकहोस्ट के साथ? या यह सही सवाल है?

जाहिर है इस सुरक्षा कारणों के लिए लागू किया गया है, लेकिन वे क्या सुरक्षित करने के लिए कोशिश कर रहे हैं ?? और, इसे एक डॉट के साथ काम करने के लिए, क्या मैंने अभी इस सुरक्षा सुविधा में सुरक्षा छेद का पर्दाफाश किया था?

वैसे, मेरे मेजबान फ़ाइल है, जबकि अन्य मेजबान के लिए बदल, कुछ खास नहीं स्थानीय होस्ट के साथ चल रहा है; डिफ़ॉल्ट 127.0.0.1/:: 1 अभी भी बिना किसी ओवरराइड के स्थान पर हैं।

फ़ॉलो-अप:

127.0.0.1 local.mysite.com 

.. करने के लिए अपने मेजबान फ़ाइल, फिर मेरे Global.asax के लिए निम्न कोड जोड़ने:

protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
    if (Request.Headers["Host"].Split(':')[0] == "localhost") 
    { 
     Response.Redirect(
      Request.Url.Scheme 
      + "://" 
      + "local.mysite.com" 
      + ":" + Request.Url.Port.ToString() 
      + Request.Url.PathAndQuery 
      , true); 
    } 
} 
मैं जोड़कर स्थानीय विकास प्रयोजनों के लिए इस पिछले मिला
+0

मैं फ़ायरबग जैसे टूल का उपयोग करने का सुझाव देता हूं और देखता हूं कि जेएसओएनपी सामान के लिए "स्क्रिप्ट" अनुरोध किया जा रहा है, और वास्तव में देखें कि कौन सा डेटा वापस आ रहा है। –

+0

डेटा मान्य था। जैसा कि वर्णन किया गया है, वर्कअराउंड स्थानीयहोस्ट से दूर होना था (स्क्रिप्ट और डेटा अन्यथा वही रहे) और यह "निश्चित" है, लेकिन यह पूरी तरह से समझा नहीं रहा है कि क्या हो रहा है। –

+0

हां, यही कारण है कि मैं अवांछित संस्करण के लिए घटनाओं को लॉगिंग करने का सुझाव देता हूं। –

उत्तर

3

मैं वहां एक जवाब फेंकने जा रहा हूं; कुछ विचारों के बाद मैं अपने निष्कर्ष तक पहुंच गया हूं।

यह हो सकता है कि यह एक सुरक्षा सुविधा है जिसे क्लाइंट मशीन पर चल रहे JSONP सेवाओं को आक्रमण करने से इंटरनेट वेबसाइट को विफल करने का प्रयास किया गया है।

एक वेबसाइट सिर्फ बंदरगाहों की एक सूची के माध्यम से जा सकती है और विभिन्न बंदरगाहों और पथों पर लोकलहोस्ट का आह्वान कर सकती है। 'लोकलहोस्ट' कुछ DNS होस्टनामों में से एक है जो कि कहां और कहां पूछताछ के आधार पर गतिशील होते हैं, जिससे संभावित लक्ष्य कमजोर होते हैं। और हां, तथ्य यह है कि एक डॉट (।) को 'लोकलहोस्ट' ('लोकहोस्ट') में जोड़ना एक कामकाजी कामकाज उत्पन्न करता है जो सुरक्षा भेद्यता का पर्दाफाश करता है, लेकिन विकास पिल्लों के लिए एक [टेंटेटिव] कामकाज प्रदान करता है।

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

1

मुझे एक ही समस्या का सामना करना पड़ रहा है। अधिकांश समाधान मैंने आईई (7) के साथ काम करने की कोशिश की है, लेकिन मुझे गेंद खेलने के लिए फ़ायरफ़ॉक्स (3.5.2) प्राप्त करने में कठिनाई हो रही है।

मैंने यह देखने के लिए एचटीपीफ़ॉक्स स्थापित किया है कि क्लाइंट पर मेरे सर्वर के प्रतिक्रियाओं का अर्थ कैसे लिया जा रहा है, और मुझे NS_ERROR_DOM_BAD_URI मिल रहा है। हालांकि, मेरी स्थिति आपके लिए थोड़ा अलग है, क्योंकि मैं एक ही साइट पर एक JSONP कॉल को वापस लाने का प्रयास कर रहा हूं, होस्टिंग पेज आया था, और फिर यह कॉल किसी अन्य साइट पर 302 रीडायरेक्ट के साथ प्रतिक्रिया दे रही है। (मैं ब्राउज़र पर वापस आने वाले दोनों डोमेन से कुकीज़ प्राप्त करने के लिए एक सुविधाजनक तरीका के रूप में रीडायरेक्ट का उपयोग कर रहा हूं।)

मैं jQuery का उपयोग कर रहा हूं, और मैंने मूल रूप से $ .ajax() के माध्यम से एक मानक AJAX कॉल करने का प्रयास किया। मुझे लगा कि प्रारंभिक अनुरोध होस्टिंग पेज के समान साइट पर था, फ़ायरफ़ॉक्स सिर्फ दूसरे डोमेन पर 302 प्रतिक्रिया का पालन करेगा। लेकिन नहीं, यह एक्सएसएस रक्षा के असफल होने के लिए दिखाई दिया। (ध्यान दें कि Returning redirect as response to XHR request के विपरीत, jQuery मानक डेटा के लिए 302 रीडायरेक्ट का पालन करता है टाइप = "जेसन" कॉल: एक ही डोमेन पर रीडायरेक्ट ठीक काम करता है; किसी अन्य डोमेन पर रीडायरेक्ट ब्राउज़र में NS_ERROR_DOM_BAD_URI उत्पन्न करता है।) एक तरफ, मुझे नहीं लगता कि अन्य डोमेन पर समान डोमेन 302 रीडायरेक्ट क्यों नहीं किया जा सकता है - आखिरकार, यह होस्टिंग पेज का डोमेन है जो रीडायरेक्ट जारी कर रहा है, तो इसे विश्वसनीय क्यों नहीं किया जा सकता है? यदि आप इंजेक्शन हमलों को पटकथा के बारे में चिंतित हैं, तो JSONP मार्ग दुर्व्यवहार के लिए खुला है ...

jQuery का $ .getJSON() एक कॉलबैक =? प्रत्यय भी एक ही त्रुटि के साथ फ़ायरफ़ॉक्स में विफल रहता है। जैसा कि $ .getScript() का उपयोग अपने स्वयं के JSONP < स्क्रिप्ट > टैग को रोल करने के लिए करता है।

क्या काम करने के लिए, HTML में एक पूर्व मौजूदा < स्क्रिप्ट आईडी = "jsonp" type = "text/javascript" > </लिपि > होने और फिर $ उपयोग कर रहा है प्रकट होता है ("jsonp")। Attr (जेएसओएनपी कॉल का आह्वान करने के लिए "src", url + "? callback = myCallback")। यदि मैं ऐसा करता हूं, तो क्रॉस-डोमेन 302 रीडायरेक्ट का पालन किया जाता है और मुझे मेरी JSON प्रतिक्रिया myCallback (जिसे मैंने < स्क्रिप्ट/> टैग के रूप में परिभाषित किया है) में पारित किया है।

और, हाँ, मैं स्थानीयहोस्ट के साथ कैसिनी का उपयोग करके यह सब विकसित कर रहा हूं: पोर्ट यूआरएल। कैसिनी गैर-लोकहोस्ट यूआरएल का जवाब नहीं देगी, इसलिए मैं आसानी से स्थानीय.mysite.com को यह देखने के लिए नहीं देख सकता कि क्या ऊपर दिए गए समाधानों पर इसका कोई असर पड़ता है या नहीं। हालांकि, स्थानीयहोस्ट के अंत में एक बिंदु चिपकाने से मेरी सारी समस्याएं ठीक हो गई हैं!

अब मैं वापस एक मानक $ .ajax पर जा सकते हैं ({... डेटाप्रकार: "jsonp" ...}) स्थानीय होस्ट के साथ फोन __.__: बंदरगाह स्थानीय होस्ट के बजाय: बंदरगाह और सब कुछ ठीक है । मुझे यह दिलचस्प लगता है कि पृष्ठ के HTML में पूर्व-मौजूद एक स्क्रिप्ट टैग की src विशेषता को संशोधित करना सामान्य लोकलहोस्ट यूआरएल को लागू करने की इजाजत देता है - मुझे लगता है कि आपकी विचार प्रक्रिया के बाद, यह एक और सुरक्षा भेद्यता हो सकती है।

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