با نقض کد میزبان از راه دور مقابله کنید

کد میزبانی از راه دور یا RHC، چیزی است که فروشگاه وب کروم به هر چیزی که توسط مرورگر اجرا می‌شود و از جایی غیر از فایل‌های خود برنامه افزودنی بارگذاری می‌شود، می‌گوید. چیزهایی مانند جاوا اسکریپت و WASM. این شامل داده یا چیزهایی مانند JSON یا CSS نیست .

چرا RHC دیگر مجاز نیست؟

با استفاده از افزونه‌های Manifest V3، اکنون باید همه کدهایی را که استفاده می‌کنند در داخل خود برنامه افزودنی دسته‌بندی کنند. در گذشته، می‌توانید تگ‌های اسکریپت را به صورت پویا از هر URL در وب تزریق کنید.

به من گفتند داخلی من RHC دارد. چه خبر است؟

اگر برنامه افزودنی شما در حین بررسی با خطای Blue Argon رد شد، بازبینان ما معتقدند که برنامه افزودنی شما از کد میزبانی از راه دور استفاده می کند. این معمولاً نتیجه تلاش یک برنامه افزودنی برای اضافه کردن یک برچسب اسکریپت با یک منبع راه دور (یعنی از وب باز، به جای فایل‌های موجود در پسوند) یا دریافت منبعی برای اجرای مستقیم است.

نحوه تشخیص RHC

هنگامی که بدانید به دنبال چه چیزی باشید، تشخیص RHC چندان دشوار نیست. ابتدا، رشته های "http://" یا "https://" را در پروژه خود بررسی کنید. اگر نقض RHC دارید، احتمالاً می توانید با پیدا کردن آن، آنها را پیدا کنید. اگر یک سیستم ساخت کامل دارید یا از وابستگی های npm یا سایر منابع شخص ثالث استفاده می کنید، مطمئن شوید که نسخه کامپایل شده کد را جستجو می کنید، زیرا این همان چیزی است که توسط فروشگاه ارزیابی می شود. اگر هنوز نتوانستید مشکل را پیدا کنید، قدم بعدی این است که با پشتیبانی One Stop تماس بگیرید. آن‌ها می‌توانند موارد نقض خاص و آنچه را که برای انتشار هر چه سریع‌تر افزونه لازم است، تشریح کنند.

اگر کتابخانه ای در حال درخواست کد باشد چه باید کرد

صرف نظر از اینکه کد از کجا آمده است، داشتن RHC مجاز نیست. این شامل کدهایی است که شما ننوشته اید، اما اتفاقاً به عنوان یک وابستگی در پروژه خود استفاده می کنید. برخی از توسعه دهندگانی که از Firebase استفاده می کنند، زمانی که کد راه دور برای استفاده در Firebase Auth گنجانده شده بود، این مشکل را داشتند. حتی اگر این یک کتابخانه شخص اول (یعنی متعلق به گوگل) بود، هیچ استثنایی برای RHC داده نشده است. باید کد را طوری پیکربندی کنید که RHC را حذف کند یا poject خود را به‌روزرسانی کنید تا ابتدا شامل کد نباشد. اگر به مشکلی برخوردید که در آن کد شما نیست که RHC را بارگیری می کند، بلکه کتابخانه ای است که از آن استفاده می کنید، بهترین اقدام این است که با نویسنده کتابخانه تماس بگیرید. به آن‌ها اطلاع دهید که این اتفاق می‌افتد، و برای حذف آن راه‌حل یا به‌روزرسانی کد بخواهید.

اگر نتوانید منتظر به‌روزرسانی کتابخانه باشید، چه می‌شود

برخی از کتابخانه‌ها تقریباً بلافاصله پس از اطلاع‌رسانی، به‌روزرسانی را ارسال می‌کنند، اما برخی دیگر ممکن است رها شوند یا رسیدگی به این مشکل زمان بر باشد. بسته به آنچه در نقض خاص اتفاق می افتد، ممکن است نیازی نباشد منتظر بمانید تا آنها حرکت کنند تا رفع انسداد شود و یک بررسی موفقیت آمیز انجام شود. تعدادی گزینه برای راه اندازی مجدد و اجرای سریع وجود دارد.

کد را حسابرسی کنید

آیا مطمئن هستید که کدی که باعث درخواست می شود مورد نیاز است؟ اگر فقط می توان آن را حذف کرد، یا کتابخانه ای که باعث آن شده است را می توان حذف کرد، آن کد را حذف کنید و کار تمام می شود.

از طرف دیگر، آیا کتابخانه دیگری وجود دارد که همین ویژگی ها را ارائه دهد؟ npmjs.com ، GitHub یا سایت‌های دیگر را برای گزینه‌های دیگری که موارد استفاده مشابه را برآورده می‌کنند، بررسی کنید.

تکان درخت

اگر کدی که باعث نقض RHC می‌شود واقعاً استفاده نمی‌شود، ممکن است بتوان آن را به‌طور خودکار با ابزارسازی حذف کرد. ابزارهای ساخت مدرن مانند webpack ، Rollup و Vite (فقط به نام چند مورد) دارای ویژگی به نام لرزش درخت هستند. هنگامی که در سیستم ساخت شما فعال شد، تکان دادن درخت باید مسیرهای کد استفاده نشده را حذف کند. این می تواند به این معنی باشد که شما نه تنها یک نسخه سازگارتر از کد خود دارید، بلکه یک نسخه کمتر و سریعتر نیز دارید! توجه به این نکته ضروری است که همه کتابخانه‌ها نمی‌توانند درخت تکان داده شوند، اما بسیاری از کتابخانه‌ها این امکان را دارند. برخی از ابزارها، مانند Rollup و Vite، به طور پیش فرض لرزش درخت را فعال کرده اند. وب پک باید پیکربندی شود تا فعال شود. اگر از یک سیستم ساخت به عنوان بخشی از برنامه افزودنی خود استفاده نمی‌کنید، اما از کتابخانه‌های کد استفاده می‌کنید ، واقعاً تشویق می‌شوید که در مورد افزودن ابزار ساخت به گردش کار خود تحقیق کنید. ابزارهای ساخت به شما کمک می‌کنند پروژه‌های ایمن‌تر، قابل اعتمادتر و قابل نگهداری‌تر بنویسید.

جزئیات نحوه اجرای درخت تکانی به پروژه خاص شما بستگی دارد. اما برای مثال ساده با Rollup، می‌توانید فقط با کامپایل کردن کد پروژه خود، درخت تکان دادن را اضافه کنید. به عنوان مثال، اگر فایلی دارید که فقط به 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 فایل ورودی، افزونه مورد نیاز برای بارگیری فایل‌های گره @rollup/plugin-node-resolve و نام فایل خروجی که تولید می‌کند، بگویید.

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

با اجرای این دستور در یک پنجره ترمینال، یک نسخه تولید شده از فایل main.js ما دریافت خواهید کرد که همه در یک فایل منفرد به نام compiled.js شده است.

Rollup می تواند ساده باشد، اما همچنین بسیار قابل تنظیم است. شما می توانید انواع منطق و پیکربندی پیچیده را اضافه کنید، فقط مستندات آنها را بررسی کنید. افزودن ابزار ساخت مانند این منجر به کد کوچکتر و کارآمدتر می شود و در این مورد، مشکل کد میزبان از راه دور ما را برطرف می کند.

ویرایش خودکار فایل ها

روشی که به طور فزاینده ای متداول می شود که کد میزبان از راه دور می تواند به پایگاه کد شما وارد شود، این است که به عنوان یک وابستگی فرعی از کتابخانه ای است که شما شامل آن می شوید. اگر کتابخانه X می‌خواهد کتابخانه Y از یک CDN 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
    }
  }]
};

هنگامی که ساختنی را با افزونه جدید اجرا می کنید، هر URL import از راه دور بدون توجه به اینکه کد ما بوده یا نه، یک وابستگی فرعی، وابستگی فرعی یا هر جای دیگری کشف می شود.

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

ویرایش دستی فایل ها

ساده ترین گزینه فقط حذف کدی است که باعث RHC می شود. در ویرایشگر متن دلخواه خود باز کنید و خطوط ناقض را حذف کنید. این معمولاً چندان توصیه نمی شود ، زیرا شکننده است و می توان آن را فراموش کرد. وقتی فایلی به نام "library.min.js" در واقع library.min.js نباشد، نگهداری پروژه شما را سخت تر می کند. به جای ویرایش فایل‌های خام، گزینه‌ای که کمی قابل نگهداری‌تر است، استفاده از ابزاری مانند Patch-package است. این یک گزینه فوق العاده قدرتمند است که به شما امکان می دهد تغییرات را در یک فایل ذخیره کنید، نه خود فایل. این بر روی فایل های پچ ساخته شده است، همان چیزی که سیستم های کنترل نسخه مانند Git یا Subversion را تقویت می کند. شما فقط باید کد نقض کننده را به صورت دستی تغییر دهید، فایل diff را ذخیره کنید و پچ بسته را با تغییراتی که می خواهید اعمال کنید پیکربندی کنید. می توانید یک آموزش کامل در مورد readme پروژه را بخوانید. اگر پروژه‌ای را اصلاح می‌کنید، واقعاً شما را تشویق می‌کنیم که با پروژه تماس بگیرید و درخواست کنید تغییرات در بالادست انجام شود. در حالی که پچ پکیج مدیریت وصله ها را بسیار آسان تر می کند، نداشتن چیزی برای وصله حتی بهتر است.

در صورت عدم استفاده از کد چه باید کرد

همانطور که پایگاه های کد رشد می کنند، وابستگی ها (یا وابستگی یک وابستگی، یا وابستگی به...) می توانند مسیرهای کدی را که دیگر استفاده نمی شوند حفظ کنند. اگر یکی از آن بخش ها شامل کدی برای بارگیری یا اجرای RHC باشد، باید حذف شود. مرده یا استفاده نشده فرقی نمی کند. اگر از آن استفاده نمی شود باید حذف شود، یا با تکان دادن درخت، یا وصله کردن کتابخانه برای حذف آن.

آیا راه حلی وجود دارد؟

به طور کلی، نه. RHC مجاز نیست. با این حال، موارد کمی وجود دارد که مجاز است . اینها تقریباً همیشه مواردی هستند که برای هر گزینه دیگری غیرممکن است.

API اسکریپت های کاربر

اسکریپت‌های کاربر ، قطعه‌های کد کوچکی هستند که معمولاً توسط کاربر ارائه می‌شوند و برای مدیران اسکریپت کاربر مانند TamperMonkey و Violentmonkey در نظر گرفته شده‌اند. برای این مدیران امکان بسته‌بندی کدهایی که توسط کاربران نوشته شده است وجود ندارد، بنابراین User Script API راهی را برای اجرای کد ارائه شده توسط کاربر نشان می‌دهد. این جایگزینی برای chrome.scripting.executeScript یا سایر محیط های اجرای کد نیست . کاربران باید حالت توسعه دهنده را برای اجرای هر چیزی فعال کنند. اگر تیم بازبینی فروشگاه وب Chrome فکر می‌کند که از این مورد به روشی غیر از آن استفاده می‌شود (یعنی کد ارائه شده توسط کاربر)، ممکن است رد شود یا فهرست آن از فروشگاه حذف شود.

chrome.debugger

chrome.debugger API به برنامه‌های افزودنی امکان تعامل با پروتکل Chrome Devtools را می‌دهد. این همان پروتکلی است که برای Devtools کروم و تعداد شگفت انگیزی از ابزارهای دیگر استفاده می شود. با آن، یک برنامه افزودنی می تواند کد راه دور را درخواست و اجرا کند. درست مانند اسکریپت های کاربر، جایگزینی برای chrome.scripting نیست و تجربه کاربری بسیار قابل توجه تری دارد. در حالی که از آن استفاده می شود، کاربر یک نوار هشدار را در بالای پنجره می بیند. اگر بنر بسته یا رد شود، جلسه رفع اشکال خاتمه می یابد.

اسکرین شات نوار آدرس در کروم که پیام «افزونه دیباگر شروع به رفع اشکال این مرورگر کرد» دارد.
اسکرین شات نوار آدرس در کروم که پیام «افزونه دیباگر شروع به رفع اشکال این مرورگر کرد» دارد.

آی فریم های Sandboxed

اگر باید یک رشته را به عنوان کد ارزیابی کنید، و در یک محیط DOM هستید (مثلاً یک اسکریپت محتوا، بر خلاف یک سرویس دهنده برنامه افزودنی)، سپس گزینه دیگر استفاده از iframe sandboxed است. برنامه‌های افزودنی به‌طور پیش‌فرض از مواردی مانند eval() به عنوان یک اقدام احتیاطی ایمنی پشتیبانی نمی‌کنند. کدهای مخرب می تواند ایمنی و امنیت کاربر را به خطر بیندازد. اما زمانی که کد فقط در یک محیط امن شناخته شده اجرا می شود، مانند یک iframe که از سایر قسمت های وب سندباکس شده است، این خطرات تا حد زیادی کاهش می یابد. در این زمینه، سیاست امنیتی محتوا که استفاده از eval را مسدود می‌کند، برداشته می‌شود و به شما امکان می‌دهد هر کد جاوا اسکریپت معتبری را اجرا کنید.

اگر موردی دارید که پوشش داده نشده است، با استفاده از فهرست پستی chromium-extensions برای دریافت بازخورد با تیم تماس بگیرید، یا یک بلیط جدید برای درخواست راهنمایی از پشتیبانی One Stop باز کنید.

در صورت مخالفت با حکم چه باید کرد

اعمال خط‌مشی‌ها می‌تواند متفاوت باشد و بازبینی شامل ورودی دستی است، به این معنی که تیم فروشگاه وب Chrome گاهی اوقات ممکن است با تغییر تصمیم بررسی موافقت کند. اگر فکر می‌کنید که در بررسی اشتباهی رخ داده است، می‌توانید با استفاده از پشتیبانی یک توقف نسبت به رد درخواست تجدیدنظر کنید