एक्सटेंशन की सुरक्षा बेहतर बनाएं

मेनिफ़ेस्ट V3 की सुरक्षा को बेहतर बनाना

यह तीन सेक्शन में से आखिरी है, जो उस कोड में ज़रूरी बदलावों के बारे में बताता है जो एक्सटेंशन सर्विस वर्कर का हिस्सा नहीं है. इसमें उन बदलावों के बारे में बताया गया है जो एक्सटेंशन की सुरक्षा को बेहतर बनाने के लिए ज़रूरी हैं. बाकी दो सेक्शन में मेनिफ़ेस्ट V3 में अपग्रेड करने और ब्लॉक किए जाने वाले वेब अनुरोधों को बदलने के लिए ज़रूरी अपने कोड को अपडेट करने के बारे में बताया गया है.

आर्बिट्रेरी स्ट्रिंग एक्ज़ीक्यूशन की सुविधा हटाएं

अब आपके पास executeScript(), eval(), और new Function() का इस्तेमाल करके, बाहरी लॉजिक का इस्तेमाल करने का विकल्प नहीं है.

  • सभी बाहरी कोड (JS, Wasm, CSS) को अपने एक्सटेंशन बंडल में ले जाएं.
  • एक्सटेंशन बंडल से रिसॉर्स लोड करने के लिए, स्क्रिप्ट और स्टाइल रेफ़रंस अपडेट करें.
  • रनटाइम के दौरान, रिसॉर्स के यूआरएल बनाने के लिए, chrome.runtime.getURL() का इस्तेमाल करें.
  • सैंडबॉक्स किए गए iframe का इस्तेमाल करें: सैंडबॉक्स किए गए iframe में, eval और new Function(...) अब भी काम करते हैं. ज़्यादा जानकारी के लिए, सैंडबॉक्स किए गए iframe की गाइड पढ़ें.

executeScript() तरीका, अब tabs नेमस्पेस के बजाय scripting नेमस्पेस में है. कॉल अपडेट करने से जुड़ी जानकारी के लिए, executeScript() दूसरी जगह ले जाएं देखें.

यहां कुछ ऐसे खास मामले दिए गए हैं जिनमें अब भी आर्बिट्रेरी स्ट्रिंग एक्ज़ीक्यूट की जा सकती हैं:

रिमोट तरीके से होस्ट किया गया कोड हटाएं

मेनिफ़ेस्ट V3 में, आपके एक्सटेंशन के सभी लॉजिक, एक्सटेंशन पैकेज का हिस्सा होना चाहिए. Chrome Web Store की नीति के मुताबिक, अब रिमोट तरीके से होस्ट की गई फ़ाइलों को लोड और एक्ज़ीक्यूट नहीं किया जा सकता. उदाहरण के लिए:

  • डेवलपर के सर्वर से ली गई JavaScript फ़ाइलें.
  • CDN पर होस्ट की गई कोई भी लाइब्रेरी.
  • तीसरे पक्ष की बंडल की गई लाइब्रेरी, जो रिमोट के ज़रिए होस्ट किए गए कोड को डाइनैमिक तरीके से फ़ेच करती हैं.

रिमोट होस्टिंग की वजह और आपके इस्तेमाल के उदाहरण के आधार पर, अन्य तरीके उपलब्ध हैं. इस सेक्शन में, इन तरीकों के बारे में बताया गया है. अगर आपको रिमोट तरीके से होस्ट किए गए कोड का इस्तेमाल करने में समस्याएं आ रही हैं, तो हमारे पास दिशा-निर्देश उपलब्ध हैं.

कॉन्फ़िगरेशन से मिलने वाली सुविधाएं और लॉजिक

आपका एक्सटेंशन, रनटाइम के दौरान रिमोट कॉन्फ़िगरेशन (उदाहरण के लिए, कोई JSON फ़ाइल) को लोड और कैश मेमोरी में सेव करता है. कैश मेमोरी में सेव किए गए कॉन्फ़िगरेशन से यह तय होता है कि कौनसी सुविधाएं चालू हैं.

रिमोट सर्विस के साथ बाहरी लॉजिक

आपका एक्सटेंशन, रिमोट वेब सेवा को कॉल करता है. इससे आपको कोड को निजी रखने और उसे ज़रूरत के हिसाब से बदलने में मदद मिलती है. साथ ही, Chrome Web Store में फिर से सबमिट करने की ज़रूरत नहीं पड़ती.

किसी सैंडबॉक्स किए गए iframe में, रिमोट तरीके से होस्ट किया गया कोड एम्बेड करना

दूर से होस्ट किया गया कोड सैंडबॉक्स किए गए iframe में काम करता है. कृपया ध्यान दें कि अगर कोड को एम्बेड किए जा रहे पेज के डीओएम तक ऐक्सेस की ज़रूरत होती है, तो यह तरीका काम नहीं करता.

तीसरे पक्ष की लाइब्रेरी को बंडल करें

अगर React या बूटस्ट्रैप जैसे किसी लोकप्रिय फ़्रेमवर्क का इस्तेमाल किया जा रहा है, जिसे पहले बाहरी सर्वर से लोड किया जा रहा था, तो छोटी की गई फ़ाइलों को डाउनलोड किया जा सकता है. साथ ही, उन्हें अपने प्रोजेक्ट में जोड़ा जा सकता है और उन्हें स्थानीय तौर पर इंपोर्ट किया जा सकता है. उदाहरण के लिए:

<script src="./react-dom.production.min.js"></script>
<link href="./bootstrap.min.css" rel="stylesheet">

सर्विस वर्कर में लाइब्रेरी शामिल करने के लिए, मेनिफ़ेस्ट में "background.type" कुंजी को "module" पर सेट करें और import स्टेटमेंट का इस्तेमाल करें.

टैब-इंजेक्टेड स्क्रिप्ट में बाहरी लाइब्रेरी का इस्तेमाल करना

बाहरी लाइब्रेरी को रनटाइम के दौरान भी लोड किया जा सकता है. इसके लिए, scripting.executeScript() को कॉल करते समय, उन्हें files कलेक्शन में जोड़ें. हालांकि, रनटाइम के दौरान अब भी रिमोट तरीके से डेटा लोड किया जा सकता है.

chrome.scripting.executeScript({
  target: {tabId: tab.id},
  files: ['jquery-min.js', 'content-script.js']
});

कोई फ़ंक्शन इंजेक्ट करें

अगर आपको ज़्यादा डाइनैमिक चाहिए, तो scripting.executeScript() में नई func प्रॉपर्टी की मदद से फ़ंक्शन को कॉन्टेंट स्क्रिप्ट के तौर पर इंजेक्ट किया जा सकता है. साथ ही, args प्रॉपर्टी का इस्तेमाल करके वैरिएबल पास किए जा सकते हैं.

मेनिफ़ेस्ट V2
let name = 'World!';
chrome.tabs.executeScript({
  code: `alert('Hello, ${name}!')`
});

बैकग्राउंड के लिए स्क्रिप्ट फ़ाइल में.

मेनिफ़ेस्ट V3
async function getCurrentTab() {/* ... */}
let tab = await getCurrentTab();

function showAlert(givenName) {
  alert(`Hello, ${givenName}`);
}

let name = 'World';
chrome.scripting.executeScript({
  target: {tabId: tab.id},
  func: showAlert,
  args: [name],
});

बैकग्राउंड सर्विस वर्कर में.

Chrome एक्सटेंशन सैंपल डेटा स्टोर करने की सुविधा में, फ़ंक्शन इंजेक्शन का एक उदाहरण मौजूद है. इस उदाहरण में बताया गया है कि आपको इसके बारे में पूरी जानकारी है. getCurrentTab() का एक उदाहरण, उस फ़ंक्शन के रेफ़रंस में है.

अन्य समाधान देखें

अगर पिछले तरीकों से आपको मदद नहीं मिलती, तो आपको कोई दूसरा तरीका अपनाना पड़ सकता है. जैसे, किसी दूसरी लाइब्रेरी में माइग्रेट करना या लाइब्रेरी की सुविधाओं का इस्तेमाल करने के दूसरे तरीके ढूंढना. उदाहरण के लिए, Google Analytics के मामले में, हमारी Google Analytics 4 गाइड में बताए गए तरीके से, रिमोट तरीके से होस्ट किए गए JavaScript के आधिकारिक वर्शन का इस्तेमाल करने के बजाय, Google मेज़रमेंट प्रोटोकॉल पर स्विच किया जा सकता है.

कॉन्टेंट की सुरक्षा के बारे में नीति अपडेट करना

"content_security_policy" को manifest.json फ़ाइल से नहीं हटाया गया है. हालांकि, अब यह एक डिक्शनरी है, जो दो प्रॉपर्टी के साथ काम करती है: "extension_pages" और "sandbox".

मेनिफ़ेस्ट V2
{
  ...
  "content_security_policy": "default-src 'self'"
  ...
}
मेनिफ़ेस्ट V3
{
  ...
  "content_security_policy": {
    "extension_pages": "default-src 'self'",
    "sandbox": "..."
  }
  ...
}

extension_pages: आपके एक्सटेंशन के कॉन्टेक्स्ट का रेफ़रंस देता है. इसमें एचटीएमएल फ़ाइलें और सर्विस वर्कर भी शामिल हैं.

sandbox: आपके एक्सटेंशन में इस्तेमाल होने वाले, सैंडबॉक्स किए गए एक्सटेंशन पेज के बारे में बताता है.

काम न करने वाले कॉन्टेंट की सुरक्षा से जुड़ी नीतियां हटाएं

मेनिफ़ेस्ट V3, "extension_pages" फ़ील्ड में कॉन्टेंट की सुरक्षा से जुड़ी नीति की कुछ ऐसी वैल्यू की अनुमति नहीं देता जिन्हें मेनिफ़ेस्ट V2 में इस्तेमाल करने की अनुमति दी गई थी. खास तौर पर, Manifest V3 उन ऐप्लिकेशन को अनुमति नहीं देता जो रिमोट कोड को चलाने की अनुमति देते हैं. script-src, object-src और worker-src डायरेक्टिव में, सिर्फ़ ये वैल्यू हो सकती हैं:

  • self
  • none
  • wasm-unsafe-eval
  • सिर्फ़ पैक नहीं किए गए एक्सटेंशन: कोई भी लोकलहोस्ट सोर्स, (http://localhost, http://127.0.0.1 या उन डोमेन पर कोई पोर्ट)

sandbox के लिए, कॉन्टेंट की सुरक्षा नीति की वैल्यू में ऐसी कोई नई पाबंदी नहीं है.