2013-01-02 39 views
6

अवरुद्ध है मैं Google को अपना webapp में jQuery की मेजबानी का उपयोग कर रहा क्या दिया जाता है (//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js) बग निदान के हिस्से के रूप में मैं एक window.onerror हैंडलर जो किसी भी त्रुटि मैं स्थानीय रूप से पकड़ने नहीं कर रहा हूँ पकड़ता और सर्वर उनके बारे में पता है की सुविधा देता है है।देखने के लिए कैसे जब एक दूरस्थ स्क्रिप्ट

इस तरह के अब तक तो अच्छा है, लेकिन ... कभी कभी मैं मिल त्रुटियों:

"। स्क्रिप्ट त्रुटि", "लोड करने में त्रुटि स्क्रिप्ट", "अप्रत्याशित टोकन <"

मेरे धारणा यह है कि इन मामलों में Google सीडीएन अवरुद्ध है (किसी भी कारण से)। मैं jQuery के लिए एक स्थानीय वापस आने की क्या ज़रूरत है, कि मैं काफी यकीन है कि अच्छी तरह से काम कर रहा है, लेकिन मैं पता लगाने के लिए क्या लौटे किया जा रहा है ताकि मैं अपने मान्यताओं का परीक्षण कर सकते हैं और शायद गूगल CDN के लिए एक सफेद सूची पर इन उपयोगकर्ताओं में से कुछ प्राप्त करना चाहते हैं (अगर यह कंपनी फ़ायरवॉल इसे अवरुद्ध कर रहा है)।

लेकिन अब तक मैं यह पता लगाने की कैसे लौटे सामग्री प्राप्त करने में नहीं कर पाए हैं। यदि यह फ़ाइल है, तो एससीआरआईपीटी टैग के आंतरिक टेक्स्ट को पुनर्प्राप्त नहीं किया जा सकता है, क्रॉस-डोमेन नीति इत्यादि के कारण AJAX अनुरोध नहीं कर सकता है।

क्या किसी के पास कोई विचार है कि यह कैसे संभव होगा?

उत्तर

11

यह बस एक <script> टैग द्वारा संदर्भित किसी भी फाइल की सामग्री को प्राप्त करने के लिए संभव नहीं है। यह एक अच्छा कारण है: ऐसा करने से आप एक्सएचआर की समान उत्पत्ति नीति को बाधित कर सकते हैं।

पर विचार करें:

<script src="https://www.example.com/private/api/getAuthToken" id="s"></script> 

आप respnse के पाठ पहुँच पाता, तो आप ऐसा करने में सक्षम हो जाएगा:

var stolenAuthToken = $('#s').text(); 

कि स्पष्ट रूप से खराब है। इसलिए, आपको <script> टैग्स द्वारा लाए गए किसी भी चीज़ की सामग्री को पढ़ने की अनुमति नहीं है।

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

इसका मतलब है कि आपको कोई उपयोगी जानकारी नहीं मिलती CDN की मेजबानी की स्क्रिप्ट से त्रुटियों के बारे में है, तो another change पूर्ण त्रुटि विवरण एक onerror हैंडलर को पारित करने के लिए अनुमति देता है में शामिल होना एक CDN (या अन्य गैर-एक ही मूल के) सर्वर के लिए CORS के उपयोग की अनुमति के लिए बनाया गया था।

हम (फेसबुक) window.onerror म्यूट करने #363897 में लागू व्यवहार को निष्क्रिय करने के लिए एक तंत्र की जरूरत है। हमारे स्थैतिक स्क्रिप्ट संसाधनों को मुख्य साइट से किसी भिन्न डोमेन के तहत एक सीडीएन पर परोसा जाता है। चूंकि ये डोमेन भिन्न हैं क्योंकि हम एक्स-डोमेन तर्क से दूर हो रहे हैं जो हमें ब्राउज़र त्रुटियों के बारे में उपयोगी जानकारी एकत्र करने से रोकता है।

जंगली (फ़ायरफ़ॉक्स और वेबकिट ब्राउज़र में) में यह "फीचर" व्यापक रूप से पर्याप्त रूप से अपनाया गया है कि उत्पादन में जो बेजोड़ अपवाद हम देखते हैं, उनमें अब कोई कार्रवाई योग्य जानकारी नहीं है।

crossorigin attribute (मूल रूप से <img> लिए करना) आपके द्वारा निर्दिष्ट है कि एक संसाधन CORS नियमों के साथ लोड किया जा चाहिए अनुमति देता है। इसे मोज़िला, WebKit, और Chrome द्वारा कार्यान्वित किया गया है।

<script src="http://example.com/xdomainrequest" crossorigin="anonymous"></script> 
दुर्भाग्य से आप के लिए

, मेरे testing में, मैंने पाया कि गूगल CDN नहीं CORS हेडर भेज करता है।

GET http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js HTTP/1.1 
Host: ajax.googleapis.com 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0 
Accept: */* 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Referer: http://fiddle.jshell.net/josh3736/jm2JU/show/ 
Origin: http://fiddle.jshell.net 
Pragma: no-cache 
Cache-Control: no-cache 

HTTP/1.1 200 OK 
Vary: Accept-Encoding 
Content-Type: text/javascript; charset=UTF-8 
Last-Modified: Tue, 13 Nov 2012 19:53:02 GMT 
Date: Wed, 02 Jan 2013 22:54:25 GMT 
Expires: Thu, 02 Jan 2014 22:54:25 GMT 
X-Content-Type-Options: nosniff 
Server: sffe 
Content-Length: 93637 
X-XSS-Protection: 1; mode=block 
Cache-Control: public, max-age=31536000 
Age: 169036 

... 

नोट अनुरोध (एक CORS अनुरोध का संकेत) में Origin शीर्षलेख की उपस्थिति, और जवाब में एक Access-Control-Allow-Origin हैडर के अभाव। इस प्रकार, भले ही आप crossorigin विशेषता डालते हैं, तो सीओआरएस चेक विफल हो जाएगी, और आपकी स्क्रिप्ट को स्क्रब किए गए त्रुटि विवरण प्राप्त होंगे।

Google सीडीएन सर्वर पर सीओआरएस सक्षम करने के लिए three-year-old issue है। मैं अपनी सांस नहीं पकड़ूंगा।


tldr: यदि आप सार्थक त्रुटि संदेश चाहते हैं, तो आप, सभी जावास्क्रिप्ट खुद की मेजबानी करना होगा एक ही मूल पर।

+0

थोड़े मुझे क्या लगा। मैं देखूंगा कि क्या मैं प्रभावित उपयोगकर्ताओं के साथ सीधे जांच कर सकता हूं। धन्यवाद। – Pyro979

+0

तो विस्तृत, उत्कृष्ट पोस्ट! – potench