2012-05-30 15 views
15

इस small userscript को विकसित करते समय मुझे एक समस्या का सामना करना पड़ रहा था। जब मैं अपने स्क्रिप्ट के साथ चल रहा है वेबसाइट के प्रत्येक XMLHttpRequest ब्लॉक करने के लिए चाहता था, कुछ भी नहीं हो रहा था (कम से कम क्रोम के साथ):विंडो (और असुरक्षित विन्डो) <script> टैग से उपयोगकर्तास्क्रिप्ट से समान क्यों नहीं है?

function main() { 
    // Override XHR.open with a custom function 
    window.XMLHttpRequest.prototype.open = function() { 
    // Nothing... so it's supposed to block every xhr.open() call 
    } 
} 
main(); 

यही बात जब unsafeWindow द्वारा window की जगह।

हालांकि, जब मैंने इस छोटी चाल का इस्तेमाल किया, सब कुछ एक आकर्षण की तरह काम किया:

// No more call to main(), and: 
var script = document.createElement("script"); 
script.textContent = "(" + main.toString() + ")();"; 
document.body.appendChild(script); 

xhr.open के लिए हर कॉल अपने कस्टम समारोह, कोई और अधिक AJAX के द्वारा बदल दिया गया है।

तो मुझे लगता है कि window तत्व ऐसा नहीं है जब main को स्क्रिप्ट के अंदर से <script></script> कंटेनर से कॉल किया जाता है। क्या कोई मुझे समझा सकता है क्यों?

उत्तर

44

"Are Chrome user-scripts separated from the global namespace like Greasemonkey scripts?" देखें। क्रोम उपयोगकर्ता स्क्रिप्ट/सामग्री-स्क्रिप्ट और Greasemonkey स्क्रिप्ट दोनों पृष्ठ के जावास्क्रिप्ट से अलग हैं। यह आपको हैक होने से बचाने में मदद के लिए किया जाता है, लेकिन यह संघर्ष और अप्रत्याशित साइड इफेक्ट्स को भी कम करता है। , an XPCNativeWrapper sandbox में

  1. रन स्क्रिप्ट जब तक @grant none (जीएम 1.0) के रूप में प्रभाव में है:

    हालांकि, तरीकों प्रत्येक ब्राउज़र के लिए अलग हैं ...

    फ़ायरफ़ॉक्स।

  2. डिफ़ॉल्ट रूप से किसी अज्ञात फ़ंक्शन में स्क्रिप्ट को लपेटता है।
  3. लक्ष्य पृष्ठ के जावास्क्रिप्ट तक पहुंचने के लिए unsafeWindow प्रदान करता है। लेकिन सावधान रहें कि यह संभावित शत्रुतापूर्ण वेबमास्टरों के लिए unsafeWindow का पालन करने के लिए स्क्रिप्ट के संदर्भ पर वापस उपयोग करें और इस प्रकार आपको विशेषाधिकार प्राप्त करने के लिए उन्नत विशेषाधिकार प्राप्त करें।

क्रोम:

  1. रन an "isolated world" में स्क्रिप्ट।
  2. किसी अज्ञात फ़ंक्शन में स्क्रिप्ट को लपेटता है।
  3. कड़ाई से स्क्रिप्ट द्वारा पृष्ठ के जेएस तक किसी भी पहुंच को अवरुद्ध करता है और इसके विपरीत।
    क्रोम के हाल के संस्करण अब बहुत सीमित संगतता के लिए unsafeWindow नामक ऑब्जेक्ट प्रदान करते हैं, लेकिन यह ऑब्जेक्ट लक्ष्य पृष्ठ के जेएस तक कोई पहुंच प्रदान नहीं करता है। यह स्क्रिप्ट स्कोप में window जैसा है (जो पेज स्कोप में window नहीं है)।

जिसके अनुसार, कि unsafeWindow इस्तेमाल किया/पर काम करना चाहिए फ़ायरफ़ॉक्स में यदि सही ढंग से लागू अपने स्क्रिप्ट के संस्करण। यह क्रोम पर the Tampermonkey extension का उपयोग कर काम कर सकता है, लेकिन मैं अभी इसे दोबारा जांचने वाला नहीं हूं।

जब आप कि "चाल" (var script = document.createElement("script"); ...), तो आपको लक्ष्य पृष्ठ में इंजेक्शन लगाने कोड रहे हैं। यह सैंडबॉक्स को छोड़ देता है और पृष्ठ के जेएस के साथ बातचीत करने के लिए एक स्क्रिप्ट के लिए सामान्य क्रोम उपयोगकर्तास्क्रिप्ट पर एकमात्र तरीका है।

इंजेक्शन फायदे: लक्ष्य पृष्ठ द्वारा प्रदान की वस्तुओं या कार्यों का उपयोग करने की गैर Tampermonkey userscripts के लिए

  1. एक ही तरीका है।
  2. लगभग हमेशा क्रोम, फ़ायरफ़ॉक्स, ओपेरा, आदि के बीच पूरी तरह से संगत (आईई हमेशा, कुछ और है।)
  3. अक्सर पूरी लिपि को डीबग करना आसान होता है; डेवलपर उपकरण सामान्य रूप से काम करते हैं।

इंजेक्शन कमियां:

  1. स्क्रिप्ट, कम से कम इंजेक्शन भागों, GM_ कार्यों द्वारा उपलब्ध कराई गई विशेषाधिकार (विशेष रूप से क्रॉस-डोमेन) का उपयोग नहीं कर सकते हैं - विशेष रूप से GM_xmlhttpRequest()
    ध्यान दें कि वर्तमान में क्रोम केवल GM_addStyle, GM_xmlhttpRequest, GM_log और GM_openInTab, पूरी तरह से मूल रूप से समर्थन करता है।
    टैम्पर्मोनकी लगभग GM_ फ़ंक्शन लगभग पूरी तरह से समर्थन करता है।

  2. पृष्ठ के जेएस के साथ साइड इफेक्ट्स या टकराव का कारण बन सकता है।

  3. बाहरी पुस्तकालयों का उपयोग करने से और भी अधिक संघर्ष और समय के मुद्दे सामने आते हैं। यह @require जितना आसान नहीं है।
    @require, स्थानीय प्रतिलिपि से बाहरी जेएस भी चलाता है - गतिशील निष्पादन और सभी बाहरी सर्वर पर निर्भरता को समाप्त करते हैं।

  4. पृष्ठ स्क्रिप्ट को देख, उपयोग, बदल या ब्लॉक कर सकता है।

  5. जेएस सक्षम होने की आवश्यकता है। फ़ायरफ़ॉक्स Greasemonkey, विशेष रूप से, एक पृष्ठ पर चला सकते हैं जिसमें जेएस अवरुद्ध है। यह सूजन, गंदे, और/या घुसपैठ पृष्ठों पर देवता हो सकता है।

+2

यह एक अप्रत्याशित लंबा, सटीक और जानकारीपूर्ण उत्तर है। मैंने इसके साथ बहुत कुछ सीखा, धन्यवाद! (और मेरे प्रश्न के शीर्षक को संपादित करने के लिए धन्यवाद) –