रिमोट होस्ट किए गए कोड से जुड़े उल्लंघनों से निपटें

रिमोट तरीके से होस्ट किया गया कोड या RHC, Chrome वेब स्टोर ऐसे किसी भी ब्राउज़र को कॉल करता है जो एक्सटेंशन की अपनी फ़ाइलों के अलावा किसी अन्य जगह से लोड किया जाता है. JavaScript और WASM जैसी चीज़ें. इसमें JSON या सीएसएस जैसी डेटा या चीज़ें शामिल नहीं होती हैं.

अब आरएचसी की अनुमति क्यों नहीं है?

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

मुझे बताया गया था कि मेरे एक्सटेंशन में RHC है. आपको कम्यूनिटी दिशा-निर्देशों और नीतियों का उल्लंघन करने वाला किस तरह का कॉन्टेंट मिला?

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

आरएचसी को पहचानने का तरीका

जब आपको पता हो कि क्या देखना है, तब आरएचसी को पहचानना मुश्किल नहीं होता. सबसे पहले, अपने प्रोजेक्ट में "http://" या "https://" स्ट्रिंग की जांच करें. अगर आपने किसी भी तरह की आरएचसी का उल्लंघन किया है, तो उसका पता लगाकर आसानी से उसका पता लगाया जा सकता है. अगर आपके पास पूरा बिल्ड सिस्टम है या npm या तीसरे पक्ष के किसी अन्य सोर्स की डिपेंडेंसी का इस्तेमाल करते हैं, तो पक्का करें कि आप कोड का कंपोज़ किया गया वर्शन ही खोज रहे हैं, क्योंकि स्टोर इसी का आकलन कर रहा है. अगर आपको अब भी समस्या नहीं आ रही है, तो अगला चरण One Stop Support से संपर्क करें. वे खास उल्लंघनों के बारे में जानकारी दे पाएंगे. साथ ही, एक्सटेंशन को जल्द से जल्द पब्लिश करने के लिए क्या करना होगा.

अगर कोई लाइब्रेरी कोड का अनुरोध कर रही है, तो क्या करें

कोड चाहे कहीं भी हो, इसमें आरएचसी की अनुमति नहीं है. इसमें ऐसे कोड भी शामिल हैं जिन्हें आपने नहीं लिखा है, लेकिन जिन्हें आपने अपने प्रोजेक्ट में डिपेंडेंसी के तौर पर इस्तेमाल किया. Firebase पर पुष्टि करने के लिए रिमोट कोड इस्तेमाल करने के दौरान, Firebase का इस्तेमाल करने वाले कुछ डेवलपर को यह समस्या हुई. भले ही यह पहले पक्ष (यानी कि Google के मालिकाना हक वाली) लाइब्रेरी थी, फिर भी RHC के लिए कोई अपवाद नहीं दिया जाता. आपको कोड को कॉन्फ़िगर करना होगा, ताकि RHC को हटाया जा सके या अपने अनुमान को अपडेट किया जा सके, ताकि उस कोड को शामिल न किया जा सके. अगर आपको किसी ऐसी समस्या का सामना करना पड़ता है जिसमें RHC लोड होने वाला आपका कोड नहीं, बल्कि इस्तेमाल की जा रही लाइब्रेरी का कोड नहीं है, तो लाइब्रेरी के लेखक से संपर्क करना सबसे अच्छा तरीका है. उन्हें बताएं कि ऐसा हो रहा है. साथ ही, उन्हें हटाने के लिए कोई समाधान या कोड अपडेट मांगें.

अगर आपको लाइब्रेरी अपडेट का इंतज़ार नहीं करना है, तो क्या होगा

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

कोड को ऑडिट करें

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

इसके अलावा, क्या कोई ऐसी लाइब्रेरी भी है जिसमें ये सुविधाएं मिलती हैं? इस्तेमाल के उदाहरणों को पूरा करने वाले दूसरे विकल्पों के लिए, npmjs.com, GitHub या अन्य साइटें देखें.

पेड़ के हिलने की आवाज़

अगर आरएचसी उल्लंघन करने वाले कोड का असल में इस्तेमाल नहीं किया जा रहा है, तो हो सकता है कि टूल की मदद से उसे अपने-आप मिटा दिया जाए. वेबपैक, Rollup, और Vite जैसे मॉडर्न बिल्ड टूल में पेड़ को हिलाना नाम की सुविधा होती है. बिल्ड सिस्टम पर चालू होने के बाद, ट्री शेकिंग को इस्तेमाल न किए जा रहे कोड पाथ को हटा देना चाहिए. इसका मतलब यह है कि आपके पास कोड का न सिर्फ़ बेहतर वर्शन है, बल्कि यह पहले से ज़्यादा तेज़ और छोटा-बड़ा है! यह ध्यान देना ज़रूरी है कि सभी लाइब्रेरी में पेड़ हिलने-डुलने की क्षमता नहीं होती, लेकिन कई ऐसी होती हैं. रोलअप और Vite जैसे कुछ टूल में डिफ़ॉल्ट रूप से ट्री-शेकिंग की सुविधा चालू होती है. वेबपैक को चालू करने के लिए, उसे कॉन्फ़िगर करना ज़रूरी है. अगर एक्सटेंशन के हिस्से के तौर पर बिल्ड सिस्टम का इस्तेमाल नहीं किया जा रहा है, लेकिन कोड लाइब्रेरी का इस्तेमाल किया जा रहा है, तो हमारा सुझाव है कि आप अपने वर्कफ़्लो में बिल्ड टूल जोड़ने की जांच करें. बिल्ड टूल से आपको ज़्यादा सुरक्षित, ज़्यादा भरोसेमंद, और मैनेज किए जा सकने वाले प्रोजेक्ट लिखने में मदद मिलती है.

ट्रीशेकिंग को लागू करने का तरीका क्या होता है, यह आपके खास प्रोजेक्ट पर निर्भर करता है. रोलअप टूल का एक आसान उदाहरण देखने के लिए, अपने प्रोजेक्ट कोड को कंपाइल करके पेड़ों को जोड़ने की प्रोसेस जोड़ी जा सकती है. उदाहरण के लिए, अगर आपके पास कोई ऐसी फ़ाइल है जो सिर्फ़ Firebase पुष्टि में लॉग इन करती है, जिसे मुख्य.js कहा जाता है:

import { GoogleAuthProvider, initializeAuth } from "firebase/auth";

chrome.identity.getAuthToken({ 'interactive': true }, async (token) => {
  const credential = GoogleAuthProvider.credential(null, token);
  try {
    const app = initializeApp({ ... });
    const auth = initializeAuth(app, { popupRedirectResolver: undefined, persistence: indexDBLocalPersistence });
    const { user } = await auth.signInWithCredential(credential)
    console.log(user)
  } catch (e) {
    console.error(error);
  }
});

इसके बाद, आपको बस इनपुट फ़ाइल रोलअप और नोड फ़ाइलों @rollup/plugin-node-resolve को लोड करने के लिए एक प्लग इन बताना होगा. साथ ही, उस आउटपुट फ़ाइल का नाम भी बताना होगा जिसे यह जनरेट कर रही है.

npx rollup --input main.js --plugin '@rollup/plugin-node-resolve' --file compiled.js

इस निर्देश को टर्मिनल विंडो में चलाने पर, आपको हमारी main.js फ़ाइल का जनरेट किया गया वर्शन मिलेगा. इस फ़ाइल को compiled.js नाम वाली एक फ़ाइल में इकट्ठा किया जाएगा.

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

फ़ाइलों में अपने-आप बदलाव करने की सुविधा

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

इसका मतलब यह है कि वह कोड कुछ ऐसा दिखता है:

import moment from "https://unpkg.com/moment@2.29.4/moment.js"
console.log(moment())

एक छोटा रोलअप प्लगिन भी बनाया जा सकता है.

import { existsSync } from 'fs';
import fetch from 'node-fetch';

export default {
  plugins: [{
    load: async function transform(id, options, outputOptions) {
      // this code runs over all of out javascript, so we check every import
      // to see if it resolves as a local file, if that fails, we grab it from
      // the network using fetch, and return the contents of that file directly inline
      if (!existsSync(id)) {
        const response = await fetch(id);
        const code = await response.text();

        return code
      }
      return null
    }
  }]
};

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

npx rollup --input main.js --config ./rollup.config.mjs --file compiled.js

फ़ाइलों में मैन्युअल तरीके से बदलाव करना

सबसे आसान विकल्प सिर्फ़ उस कोड को मिटाना है जिससे आरएचसी की समस्या हो रही है. अपनी पसंद के टेक्स्ट एडिटर में खोलें और उल्लंघन करने वाली लाइनों को मिटा दें. आम तौर पर ऐसा करने की सलाह नहीं दी जाती, क्योंकि यह नाज़ुक होता है और इसे भुलाया जा सकता है. जब "library.min.js" नाम वाली फ़ाइल असल में Library.min.js नहीं होती, तो आपके प्रोजेक्ट को मैनेज करना मुश्किल हो जाता है. रॉ फ़ाइलों में बदलाव करने के बजाय, पैच-पैकेज जैसे टूल का इस्तेमाल करना बेहतर विकल्प है. यह एक बेहतरीन विकल्प है, जिससे बदलाव को फ़ाइल के बजाय, फ़ाइल में सेव करने की सुविधा मिलती है. यह पैच फ़ाइलों पर बनाया गया है. यह Git या सबवर्ज़न जैसे वर्शन कंट्रोल सिस्टम को चालू करता है. आपको बस उल्लंघन करने वाले कोड को मैन्युअल तरीके से बदलना होगा, डिफ़ फ़ाइल को सेव करना होगा, और पैच-पैकेज को उन बदलावों के साथ कॉन्फ़िगर करना होगा जिन्हें आपको लागू करना है. प्रोजेक्ट के लिए रीडमी पर पूरा ट्यूटोरियल पढ़ें. अगर किसी प्रोजेक्ट को पैच किया जा रहा है, तो हमारी असल में सलाह है कि आप प्रोजेक्ट से संपर्क करके, बदलाव करने का अनुरोध करें. पैच-पैकेज के ज़रिए पैच मैनेज करना आसान हो जाता है, लेकिन पैच के लिए कुछ न रखना और भी बेहतर होता है.

अगर कोड का इस्तेमाल नहीं हो रहा है, तो क्या करना चाहिए

कोड बेस के बढ़ने के साथ-साथ, डिपेंडेंसी (या किसी डिपेंडेंसी या उसकी डिपेंडेंसी... अगर उनमें से किसी सेक्शन में, आरएचसी को लोड या एक्ज़ीक्यूट करने के लिए कोड शामिल है, तो उसे हटाना होगा. इससे कोई फ़र्क़ नहीं पड़ता कि वह मर गया है या इस्तेमाल नहीं किया गया है. अगर इसका इस्तेमाल नहीं किया जा रहा है, तो इसे पेट्रोल करके या लाइब्रेरी को पैच करके हटाया जाना चाहिए.

क्या इसका कोई समाधान है?

आम तौर पर, नहीं. RHC की अनुमति नहीं है. हालांकि, कुछ मामलों में इसकी अनुमति है. ये हमेशा ऐसे मामले होते हैं जहां किसी भी दूसरे विकल्प के लिए नामुमकिन है.

उपयोगकर्ता स्क्रिप्ट एपीआई

यूज़र स्क्रिप्ट ऐसे छोटे कोड स्निपेट होते हैं जो आम तौर पर उपयोगकर्ता उपलब्ध कराते हैं. ये आम तौर पर, TamperMonkey और Hearmonkey जैसे यूज़र स्क्रिप्ट मैनेजर के लिए होते हैं. ये मैनेजर, उपयोगकर्ताओं के लिखे गए कोड को बंडल नहीं कर सकते. इसलिए, User Script API में, उपयोगकर्ता से मिले कोड को एक्ज़ीक्यूट करने का तरीका बताया जाता है. यह chrome.scripting.executeScript या किसी अन्य कोड का विकल्प नहीं है. कुछ भी चलाने के लिए, उपयोगकर्ताओं को डेवलपर मोड चालू करना होगा. अगर 'Chrome वेब स्टोर' की समीक्षा करने वाली टीम को लगता है कि इसका इस्तेमाल बताए गए तरीके (यानी उपयोगकर्ता से मिला कोड) के बजाय, किसी दूसरे तरीके से किया जा रहा है, तो उसे अस्वीकार किया जा सकता है या स्टोर से हटा दी गई सूची हो सकती है.

chrome.debugger

chrome.debugger एपीआई, एक्सटेंशन को Chrome Devtools प्रोटोकॉल से इंटरैक्ट करने की सुविधा देता है. यह वही प्रोटोकॉल है जिसका इस्तेमाल Chrome के Devtools के लिए किया जाता है. साथ ही, कई दूसरे टूल शानदार हैं. इससे, कोई एक्सटेंशन रिमोट कोड का अनुरोध कर सकता है और उसे एक्ज़ीक्यूट कर सकता है. उपयोगकर्ता स्क्रिप्ट की तरह ही, यह chrome.scripting का विकल्प नहीं है. साथ ही, इसका उपयोगकर्ता अनुभव ज़्यादा बेहतर होता है. जब तक इसका इस्तेमाल किया जा रहा होगा, तब तक उपयोगकर्ता को विंडो के ऊपर एक चेतावनी बार दिखेगा. अगर बैनर बंद या खारिज किया जाता है, तो डीबग करने का सेशन खत्म हो जाएगा.

Chrome के पता बार का स्क्रीनशॉट, जिसमें 'डीबगर एक्सटेंशन ने इस ब्राउज़र को डीबग करना शुरू कर दिया है' मैसेज दिया है
Chrome के पता बार का स्क्रीनशॉट, जिसमें 'डीबगर एक्सटेंशन ने इस ब्राउज़र को डीबग करना शुरू कर दिया है' मैसेज दिया है

सैंडबॉक्स किए गए iframe

अगर आपको कोड के तौर पर किसी स्ट्रिंग का आकलन करना है और आप DOM एनवायरमेंट (जैसे, एक्सटेंशन सर्विस वर्कर के उलट, कॉन्टेंट स्क्रिप्ट) में हैं, तो सैंडबॉक्स किए गए iframe का इस्तेमाल करना दूसरा विकल्प है. एक्सटेंशन, सुरक्षा से जुड़ी सावधानियों के तौर पर, डिफ़ॉल्ट रूप से eval() जैसी चीज़ों के साथ काम नहीं करते. नुकसान पहुंचाने वाले कोड से लोगों की सुरक्षा को खतरा हो सकता है. हालांकि, जब कोड को सिर्फ़ एक सुरक्षित एनवायरमेंट पर ही चलाया जाता है, जैसे कि कोई ऐसा iframe जिसे बाकी वेब से सैंडबॉक्स किया गया हो, तो वे जोखिम काफ़ी कम हो जाते हैं. इस संदर्भ में, eval के इस्तेमाल को रोकने वाली कॉन्टेंट सुरक्षा नीति को हटाया जा सकता है. इससे किसी भी मान्य JavaScript कोड को चलाया जा सकता है.

अगर आपके इस्तेमाल का कोई ऐसा उदाहरण है जो कवर नहीं किया गया है, तो Chromium-एक्सटेंशन के ईमेल पाने वाले लोगों की सूची की मदद से, टीम से संपर्क करें या सुझाव, शिकायत या राय पाने के लिए वन स्टॉप सहायता से मदद पाने का नया टिकट खोलें.

अगर आप किसी नतीजे से सहमत नहीं हैं, तो क्या करें

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