দূরবর্তী হোস্ট করা কোড লঙ্ঘন সঙ্গে ডিল

দূরবর্তীভাবে হোস্ট করা কোড, বা RHC, যাকে Chrome ওয়েব স্টোর বলে যা ব্রাউজার দ্বারা কার্যকর করা হয় যা এক্সটেনশনের নিজস্ব ফাইলগুলি ছাড়া অন্য কোথাও থেকে লোড করা হয়৷ JavaScript এবং WASM এর মত জিনিস। এতে ডেটা বা JSON বা CSS-এর মতো জিনিস অন্তর্ভুক্ত নয়

কেন আরএইচসি আর অনুমতি দেওয়া হয় না?

ম্যানিফেস্ট V3 এক্সটেনশনের সাথে এখন এক্সটেনশনের ভিতরেই ব্যবহার করা সমস্ত কোড বান্ডিল করতে হবে। অতীতে, আপনি ওয়েবে যেকোনো URL থেকে গতিশীলভাবে স্ক্রিপ্ট ট্যাগ ইনজেক্ট করতে পারেন।

আমাকে বলা হয়েছিল আমার এক্সটেনশনের RHC আছে। কি হচ্ছে?

যদি আপনার এক্সটেনশনটি একটি ব্লু আর্গন ত্রুটির সাথে পর্যালোচনার সময় প্রত্যাখ্যান করা হয়, তাহলে আমাদের পর্যালোচকরা বিশ্বাস করেন যে আপনার এক্সটেনশনটি দূরবর্তীভাবে হোস্ট করা কোড ব্যবহার করছে৷ এটি সাধারণত একটি এক্সটেনশন একটি রিমোট রিসোর্স সহ একটি স্ক্রিপ্ট ট্যাগ যোগ করার চেষ্টা করার ফলাফল (যেমন এক্সটেনশনে অন্তর্ভুক্ত ফাইলগুলির পরিবর্তে খোলা ওয়েব থেকে), বা সরাসরি চালানোর জন্য একটি সংস্থান আনার চেষ্টা করে

কিভাবে RHC স্পট করতে হয়

RHC স্পট করা বিশেষত কঠিন নয় একবার আপনি কী সন্ধান করবেন তা জানেন। প্রথমে, আপনার প্রকল্পে "http://" বা "https://" স্ট্রিংগুলি পরীক্ষা করুন৷ যদি আপনার একটি RHC লঙ্ঘন থাকে, তাহলে আপনি সম্ভবত এটি খুঁজে বের করে তাদের সনাক্ত করতে সক্ষম হবেন। যদি আপনার একটি সম্পূর্ণ বিল্ড সিস্টেম থাকে, বা npm বা অন্যান্য তৃতীয় পক্ষের উত্স থেকে নির্ভরতা ব্যবহার করেন, তাহলে নিশ্চিত করুন যে আপনি কোডের সংকলিত সংস্করণটি অনুসন্ধান করছেন, যেহেতু এটিই স্টোর দ্বারা মূল্যায়ন করা হচ্ছে। আপনি যদি এখনও সমস্যাটি খুঁজে না পান, তাহলে পরবর্তী পদক্ষেপটি হল ওয়ান স্টপ সাপোর্টের সাথে যোগাযোগ করা। তারা নির্দিষ্ট লঙ্ঘনের রূপরেখা দিতে সক্ষম হবে এবং যত তাড়াতাড়ি সম্ভব এক্সটেনশন প্রকাশ করার জন্য কী প্রয়োজন।

যদি একটি লাইব্রেরি কোড অনুরোধ করে তাহলে কি করতে হবে

কোডটি যেখান থেকে আসুক না কেন, এটিকে আরএইচসি থাকার অনুমতি নেই। এর মধ্যে এমন কোড অন্তর্ভুক্ত রয়েছে যা আপনি লেখেননি, কিন্তু শুধুমাত্র আপনার প্রকল্পে নির্ভরতা হিসেবে ব্যবহার করতে হবে। Firebase ব্যবহারকারী কিছু ডেভেলপারের এই সমস্যা ছিল যখন Firebase Auth- এ ব্যবহারের জন্য রিমোট কোড অন্তর্ভুক্ত করা হচ্ছিল। যদিও এটি একটি প্রথম পক্ষের (অর্থাৎ Google মালিকানাধীন) লাইব্রেরি ছিল, RHC এর জন্য কোন ব্যতিক্রম দেওয়া হয়নি। RHC অপসারণ করার জন্য আপনাকে কোডটি কনফিগার করতে হবে অথবা শুরুতে কোডটি অন্তর্ভুক্ত না করার জন্য আপনার পোজেক্ট আপডেট করতে হবে। আপনি যদি এমন একটি সমস্যায় আঘাত করেন যেখানে এটি আপনার কোড নয় যেটি RHC লোড হচ্ছে, কিন্তু একটি লাইব্রেরি যা আপনি ব্যবহার করছেন, তাহলে সর্বোত্তম পদক্ষেপ হল লাইব্রেরির লেখকের সাথে যোগাযোগ করা। তাদের জানাতে দিন যে এটি ঘটছে, এবং এটি সরানোর জন্য একটি সমাধান বা কোড আপডেটের জন্য জিজ্ঞাসা করুন।

আপনি যদি একটি লাইব্রেরি আপডেটের জন্য অপেক্ষা করতে না পারেন তাহলে কি হবে

কিছু লাইব্রেরি সূচিত হওয়ার প্রায় সাথে সাথেই একটি আপডেট পাঠাবে, তবে অন্যগুলি পরিত্যক্ত হতে পারে বা সমস্যাটি সমাধান করতে সময় নিতে পারে। নির্দিষ্ট লঙ্ঘনের ক্ষেত্রে কী ঘটছে তার উপর নির্ভর করে, আপনাকে তাদের অবরোধ মুক্ত করার জন্য এবং একটি সফল পর্যালোচনা সম্পূর্ণ করার জন্য অপেক্ষা করতে হবে না। ব্যাক আপ পেতে এবং দ্রুত চালানোর জন্য অনেকগুলি বিকল্প উপলব্ধ রয়েছে৷

কোড অডিট করুন

আপনি কি নিশ্চিত যে কোডটি যে অনুরোধটি ঘটাচ্ছে তার প্রয়োজন? যদি এটি কেবল মুছে ফেলা যায়, বা একটি লাইব্রেরি যা এটি ঘটাচ্ছে তা সরানো যেতে পারে, তাহলে সেই কোডটি মুছুন এবং কাজটি হয়ে গেছে।

বিকল্পভাবে, একই বৈশিষ্ট্যগুলি অফার করে এমন অন্য লাইব্রেরি আছে কি? npmjs.com , GitHub বা অন্যান্য সাইটগুলি পরীক্ষা করার চেষ্টা করুন যা একই ব্যবহারের ক্ষেত্রে পূরণ করে।

গাছ কাঁপছে

যদি RHC লঙ্ঘন ঘটাচ্ছে এমন কোডটি আসলে ব্যবহার করা না হয়, তাহলে এটি টুলিং দ্বারা স্বয়ংক্রিয়ভাবে মুছে ফেলা হতে পারে। ওয়েবপ্যাক , রোলআপ , এবং ভাইটের মতো আধুনিক বিল্ড টুলগুলিতে (শুধু কয়েকটি নাম বলা যায়) ট্রি-শেকিং নামে একটি বৈশিষ্ট্য রয়েছে। একবার আপনার বিল্ড সিস্টেমে সক্ষম হয়ে গেলে, ট্রি কাঁপানো কোনও অব্যবহৃত কোড পাথ মুছে ফেলা উচিত। এর অর্থ হতে পারে যে আপনার কাছে কেবলমাত্র আপনার কোডের আরও কমপ্লায়েন্ট সংস্করণ নয়, বরং একটি ক্ষীণ এবং দ্রুততর সংস্করণও রয়েছে! এটি লক্ষ করা গুরুত্বপূর্ণ যে সমস্ত লাইব্রেরি গাছের ঝাঁকুনিতে সক্ষম নয়, তবে অনেকগুলি। রোলআপ এবং ভাইটের মতো কিছু সরঞ্জামে ডিফল্টরূপে ট্রি-কাঁপানো সক্রিয় থাকে। ওয়েবপ্যাকটি সক্ষম করার জন্য এটি কনফিগার করা দরকার । আপনি যদি আপনার এক্সটেনশনের একটি অংশ হিসাবে একটি বিল্ড সিস্টেম ব্যবহার না করে থাকেন তবে কোড লাইব্রেরি ব্যবহার করছেন , তাহলে আপনি সত্যিই আপনার কর্মপ্রবাহে একটি বিল্ড টুল যুক্ত করার বিষয়ে তদন্ত করতে উত্সাহিত হন৷ বিল্ড টুল আপনাকে নিরাপদ, আরো নির্ভরযোগ্য এবং আরো রক্ষণাবেক্ষণযোগ্য প্রকল্প লিখতে সাহায্য করে।

কিভাবে ট্রিশকিং বাস্তবায়ন করা যায় তার সুনির্দিষ্টতা আপনার নির্দিষ্ট প্রকল্পের উপর নির্ভর করে। কিন্তু রোলআপের সাথে একটি সাধারণ উদাহরণ নিতে, আপনি আপনার প্রকল্প কোড কম্পাইল করে ট্রিশকিং যোগ করতে পারেন। উদাহরণস্বরূপ, যদি আপনার একটি ফাইল থাকে যা শুধুমাত্র Firebase Auth-এ লগ ইন করে, যাকে main.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 একটি CDN থেকে লাইব্রেরি Y import করতে চায়, তাহলে স্থানীয় উৎস থেকে লোড করার জন্য আপনাকে এখনও এটি আপডেট করতে হবে। আধুনিক বিল্ড সিস্টেমের সাথে, আপনি একটি দূরবর্তী রেফারেন্স বের করতে তুচ্ছভাবে প্লাগইন তৈরি করতে পারেন এবং এটি সরাসরি আপনার কোডে ইনলাইন করতে পারেন।

এর অর্থ হল প্রদত্ত কোড যা এইরকম দেখাচ্ছে:

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 URL আবিষ্কার করা হয় তা আমাদের কোড, একটি উপনির্ভরতা, উপ-নির্ভরতা, বা অন্য কোথাও ছিল কিনা তা নির্বিশেষে।

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

ম্যানুয়ালি ফাইল সম্পাদনা

সবচেয়ে সহজ বিকল্প হল কোডটি মুছে ফেলা যা RHC ঘটাচ্ছে। আপনার পছন্দের পাঠ্য সম্পাদক খুলুন, এবং লঙ্ঘনকারী লাইনগুলি মুছুন। এটি সাধারণত যুক্তিযুক্ত নয় , কারণ এটি ভঙ্গুর এবং ভুলে যেতে পারে। "library.min.js" নামক একটি ফাইল আসলে library.min.js না হলে এটি আপনার প্রজেক্ট বজায় রাখা কঠিন করে তোলে। কাঁচা ফাইলগুলি সম্পাদনা করার পরিবর্তে, প্যাচ-প্যাকেজের মতো একটি সরঞ্জাম ব্যবহার করা একটি সামান্য বেশি রক্ষণাবেক্ষণযোগ্য বিকল্প। এটি একটি সুপার পাওয়ারফুল অপশন যা আপনাকে ফাইলের পরিবর্তে ফাইলে পরিবর্তনগুলি সংরক্ষণ করতে দেয়। এটি প্যাচ ফাইলের উপর নির্মিত, একই ধরণের জিনিস যা Git বা Subversion এর মত সংস্করণ নিয়ন্ত্রণ ব্যবস্থাকে ক্ষমতা দেয়। আপনাকে শুধুমাত্র লঙ্ঘনকারী কোডটি ম্যানুয়ালি সংশোধন করতে হবে, ডিফ ফাইলটি সংরক্ষণ করতে হবে এবং আপনি যে পরিবর্তনগুলি প্রয়োগ করতে চান তার সাথে প্যাচ-প্যাকেজ কনফিগার করতে হবে। আপনি প্রকল্পের রিডমিতে একটি সম্পূর্ণ টিউটোরিয়াল পড়তে পারেন। আপনি যদি একটি প্রকল্প প্যাচ করছেন, আমরা সত্যিই আপনাকে প্রজেক্টের সাথে যোগাযোগ করার জন্য অনুরোধ করব যাতে পরিবর্তনগুলি আপস্ট্রিম করা হয়। যদিও প্যাচ-প্যাকেজ প্যাচগুলি পরিচালনা করা অনেক সহজ করে তোলে, প্যাচ করার জন্য কিছুই না থাকা আরও ভাল।

কোডটি ব্যবহার না হলে কী করবেন

কোডবেসগুলি বাড়ার সাথে সাথে, নির্ভরতা (বা নির্ভরতার নির্ভরতা, বা… এর নির্ভরতা) কোড পাথ রাখতে পারে যা আর ব্যবহার করা হচ্ছে না। যদি এই বিভাগগুলির মধ্যে একটিতে RHC লোড বা চালানোর কোড অন্তর্ভুক্ত থাকে, তাহলে এটি অপসারণ করতে হবে । এটি মৃত বা অব্যবহৃত কিনা তা কোন ব্যাপার না। যদি এটি ব্যবহার করা না হয় তবে এটিকে মুছে ফেলা উচিত, হয় গাছের ঝাঁকুনি দিয়ে, বা এটি অপসারণের জন্য লাইব্রেরিতে প্যাচ করে।

কোন সমাধান আছে?

সাধারণভাবে বলতে গেলে, না। RHC অনুমোদিত নয়। তবে, অল্প সংখ্যক ক্ষেত্রে এটি অনুমোদিত । এগুলি প্রায় সর্বদা এমন ক্ষেত্রে যেখানে অন্য কোনও বিকল্পের পক্ষে এটি অসম্ভব।

ব্যবহারকারী স্ক্রিপ্ট API

ব্যবহারকারীর স্ক্রিপ্টগুলি হল ছোট কোড স্নিপেট যা সাধারণত ব্যবহারকারী দ্বারা সরবরাহ করা হয়, যা ব্যবহারকারী স্ক্রিপ্ট পরিচালকদের জন্য যেমন TamperMonkey এবং Violentmonkey । ব্যবহারকারীদের দ্বারা লিখিত কোড বান্ডিল করা এই পরিচালকদের পক্ষে সম্ভব নয়, তাই ব্যবহারকারীর স্ক্রিপ্ট API ব্যবহারকারী দ্বারা প্রদত্ত কোড চালানোর একটি উপায় প্রকাশ করে। এটি chrome.scripting.executeScript বা অন্যান্য কোড এক্সিকিউশন পরিবেশের বিকল্প নয় ৷ ব্যবহারকারীদের যেকোনো কিছু চালানোর জন্য ডেভেলপার মোড সক্ষম করতে হবে। যদি Chrome ওয়েব স্টোর পর্যালোচনা দল মনে করে যে এটি এটির উদ্দেশ্যে (যেমন ব্যবহারকারীর দ্বারা প্রদত্ত কোড) ছাড়া অন্য উপায়ে ব্যবহার করা হচ্ছে, তবে এটি প্রত্যাখ্যান করা হতে পারে বা স্টোর থেকে তালিকাটি সরিয়ে নেওয়া হতে পারে৷

chrome.debugger

chrome.debugger API এক্সটেনশনগুলিকে Chrome Devtools প্রোটোকলের সাথে ইন্টারঅ্যাক্ট করার ক্ষমতা দেয়৷ এটি একই প্রোটোকল যা Chrome-এর Devtools এবং অন্যান্য সরঞ্জামগুলির একটি আশ্চর্যজনক সংখ্যার জন্য ব্যবহৃত হয়। এটির সাহায্যে, একটি এক্সটেনশন রিমোট কোডের অনুরোধ এবং কার্যকর করতে পারে। ব্যবহারকারীর স্ক্রিপ্টের মতোই, এটি chrome.scripting-এর বিকল্প নয়, এবং অনেক বেশি উল্লেখযোগ্য ব্যবহারকারীর অভিজ্ঞতা রয়েছে। এটি ব্যবহার করার সময়, ব্যবহারকারী উইন্ডোর শীর্ষে একটি সতর্কতা বার দেখতে পাবেন। ব্যানার বন্ধ বা খারিজ হলে, ডিবাগিং সেশনটি বন্ধ হয়ে যাবে।

Chrome-এর অ্যাড্রেস বারের স্ক্রিনশট যেখানে 'ডিবাগার এক্সটেনশন এই ব্রাউজারটিকে ডিবাগ করা শুরু করেছে' বার্তা রয়েছে
Chrome-এর অ্যাড্রেস বারের স্ক্রিনশট যেখানে 'ডিবাগার এক্সটেনশন এই ব্রাউজারটিকে ডিবাগ করা শুরু করেছে' বার্তা রয়েছে

স্যান্ডবক্সযুক্ত আইফ্রেম

আপনি যদি একটি স্ট্রিংকে কোড হিসাবে মূল্যায়ন করতে চান এবং আপনি একটি DOM পরিবেশে থাকেন (যেমন একটি বিষয়বস্তু স্ক্রিপ্ট, একটি এক্সটেনশন পরিষেবা কর্মীর বিপরীতে), তাহলে আরেকটি বিকল্প হল একটি স্যান্ডবক্সযুক্ত iframe ব্যবহার করা। এক্সটেনশনগুলি নিরাপত্তা সতর্কতা হিসাবে ডিফল্টরূপে eval() এর মতো জিনিসগুলিকে সমর্থন করে না। ক্ষতিকারক কোড ব্যবহারকারীর নিরাপত্তা এবং নিরাপত্তাকে ঝুঁকিতে ফেলতে পারে। কিন্তু যখন কোডটি শুধুমাত্র একটি পরিচিত নিরাপদ পরিবেশে কার্যকর করা হয়, যেমন একটি iframe যা বাকি ওয়েব থেকে স্যান্ডবক্স করা হয়েছে, তখন সেই ঝুঁকিগুলি অনেক কমে যায়৷ এই প্রেক্ষাপটের মধ্যে, বিষয়বস্তু সুরক্ষা নীতি যা ইভালের ব্যবহারকে অবরুদ্ধ করে তা তুলে নেওয়া যেতে পারে, যা আপনাকে যেকোনো বৈধ জাভাস্ক্রিপ্ট কোড চালানোর অনুমতি দেয়।

আপনার যদি এমন একটি ব্যবহারের ক্ষেত্রে থাকে যা কভার না করা হয়, তাহলে প্রতিক্রিয়া পেতে ক্রোমিয়াম-এক্সটেনশন মেলিং তালিকা ব্যবহার করে দলের সাথে যোগাযোগ করুন, অথবা ওয়ান স্টপ সাপোর্ট থেকে নির্দেশিকা অনুরোধ করতে একটি নতুন টিকিট খুলুন

রায়ের সাথে একমত না হলে কি করবেন

নীতিগুলি প্রয়োগ করার বিষয়টিকে সূক্ষ্ম করা যেতে পারে এবং পর্যালোচনাতে ম্যানুয়াল ইনপুট অন্তর্ভুক্ত থাকে, যার অর্থ Chrome ওয়েব স্টোর টিম কখনও কখনও পর্যালোচনার সিদ্ধান্ত পরিবর্তন করতে সম্মত হতে পারে৷ আপনি যদি বিশ্বাস করেন যে পর্যালোচনাতে ভুল হয়েছে, আপনি ওয়ান স্টপ সাপোর্ট ব্যবহার করে প্রত্যাখ্যানের আবেদন করতে পারেন