بهبود امنیت برنامه افزودنی

بهبود امنیت در Manifest V3

این آخرین بخش از سه بخش است که تغییرات مورد نیاز برای کدی را که بخشی از کارگر خدمات توسعه نیست را توضیح می‌دهد. تغییرات مورد نیاز برای بهبود امنیت برنامه های افزودنی را شرح می دهد. دو بخش دیگر به‌روزرسانی کد مورد نیاز برای ارتقاء به Manifest V3 و جایگزینی مسدود کردن درخواست‌های وب را پوشش می‌دهد.

اجرای رشته های دلخواه را حذف کنید

شما دیگر نمی توانید با استفاده از executeScript() , eval() و new Function() منطق خارجی را اجرا کنید .

  • تمام کدهای خارجی (JS، Wasm، CSS) را به بسته برنامه افزودنی خود منتقل کنید.
  • منابع اسکریپت و سبک را برای بارگیری منابع از بسته برنامه افزودنی به روز کنید.
  • از chrome.runtime.getURL() برای ساخت URL های منبع در زمان اجرا استفاده کنید.
  • از iframe sandboxed استفاده کنید: eval و new Function(...) هنوز در iframe های sandbox پشتیبانی می شوند. برای جزئیات بیشتر ، راهنمای مربوط به iframe های sandboxed را بخوانید.

متد executeScript() اکنون در فضای نام scripting به جای فضای نام tabs قرار دارد. برای اطلاعات در مورد به‌روزرسانی تماس‌ها، به Move executeScript() مراجعه کنید.

چند مورد خاص وجود دارد که در آنها اجرای رشته های دلخواه همچنان امکان پذیر است:

کد میزبان از راه دور را حذف کنید

در Manifest V3، تمام منطق برنامه افزودنی شما باید بخشی از بسته افزونه باشد. طبق خط‌مشی فروشگاه وب Chrome، دیگر نمی‌توانید فایل‌های میزبانی از راه دور را بارگیری و اجرا کنید. مثالها عبارتند از:

  • فایل‌های جاوا اسکریپت از سرور توسعه‌دهنده برداشته شده است.
  • هر کتابخانه ای که روی CDN میزبانی می شود.
  • کتابخانه های شخص ثالث همراه که به صورت پویا کد میزبان از راه دور را واکشی می کنند.

بسته به مورد استفاده شما و دلیل میزبانی از راه دور، رویکردهای جایگزین در دسترس هستند. این بخش رویکردهایی را که باید در نظر گرفته شود توضیح می دهد. اگر در ارتباط با کد میزبانی از راه دور مشکل دارید، راهنمایی در دسترس داریم.

ویژگی ها و منطق مبتنی بر پیکربندی

برنامه افزودنی شما یک پیکربندی راه دور (به عنوان مثال یک فایل JSON) را در زمان اجرا بارگیری و ذخیره می کند. پیکربندی کش تعیین می کند که کدام ویژگی فعال باشد.

منطق خارجی با یک سرویس از راه دور

برنامه افزودنی شما با یک سرویس وب راه دور تماس می گیرد. این به شما امکان می‌دهد کد را خصوصی نگه دارید و در صورت نیاز آن را تغییر دهید و در عین حال از هزینه اضافی ارسال مجدد به فروشگاه وب Chrome جلوگیری کنید.

کد میزبانی شده از راه دور را در یک iframe sandbox قرار دهید

کد میزبان از راه دور در iframe های جعبه ایمنی پشتیبانی می شود . لطفاً توجه داشته باشید که اگر کد نیاز به دسترسی به DOM صفحه جاسازی داشته باشد، این روش کار نمی کند.

مجموعه کتابخانه های شخص ثالث

اگر از یک فریمورک محبوب مانند React یا Bootstrap استفاده می‌کنید که قبلاً از یک سرور خارجی بارگیری می‌کردید، می‌توانید فایل‌های کوچک‌سازی شده را دانلود کنید، آنها را به پروژه خود اضافه کنید و آنها را به صورت محلی وارد کنید. مثلا:

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

برای گنجاندن یک کتابخانه در یک سرویس‌کار، کلید "background.type" را روی "module" در مانیفست تنظیم کنید و از یک دستور import استفاده کنید.

از کتابخانه های خارجی در اسکریپت های تزریق شده با تب استفاده کنید

همچنین می‌توانید کتابخانه‌های خارجی را در زمان اجرا با افزودن آنها به آرایه files هنگام فراخوانی scripting.executeScript() بارگیری کنید. هنوز هم می توانید داده ها را از راه دور در زمان اجرا بارگیری کنید.

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

یک تابع تزریق کنید

اگر به پویایی بیشتری نیاز دارید، ویژگی func جدید در scripting.executeScript() به شما اجازه می دهد تا یک تابع را به عنوان اسکریپت محتوا تزریق کنید و متغیرها را با استفاده از ویژگی 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 Extension Samples حاوی نمونه تزریق تابعی است که می توانید از آن عبور کنید. یک مثال از getCurrentTab() در مرجع آن تابع است.

به دنبال راه حل های دیگر باشید

اگر رویکردهای قبلی در مورد استفاده شما کمکی نکرد، ممکن است مجبور شوید راه حل جایگزینی پیدا کنید (به عنوان مثال به کتابخانه دیگری مهاجرت کنید) یا راه های دیگری برای استفاده از عملکرد کتابخانه پیدا کنید. برای مثال، در مورد Google Analytics، می‌توانید به جای استفاده از نسخه رسمی جاوا اسکریپت با میزبانی از راه دور همانطور که در راهنمای Google Analytics 4 ما توضیح داده شده است، به پروتکل اندازه‌گیری 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 : به زمینه‌های موجود در برنامه افزودنی شما، از جمله فایل‌های html و سرویس‌کاران اشاره دارد.

sandbox : به هر صفحه افزونه جعبه ایمنی که برنامه افزودنی شما استفاده می کند اشاره دارد.

خط‌مشی‌های امنیتی محتوای پشتیبانی‌نشده را حذف کنید

Manifest V3 برخی از مقادیر خط‌مشی امنیتی محتوا را در قسمت "extension_pages" که در Manifest V2 مجاز بود، غیرمجاز می‌کند. به طور خاص Manifest V3 مواردی را که اجازه اجرای کد از راه دور را می دهند، ممنوع می کند. script-src, object-src و worker-src ممکن است فقط مقادیر زیر را داشته باشند:

  • self
  • none
  • wasm-unsafe-eval
  • فقط پسوندهای بدون بسته بندی: هر منبع محلی میزبان، ( http://localhost ، http://127.0.0.1 ، یا هر پورت در آن دامنه ها)

مقادیر خط مشی امنیتی محتوا برای sandbox چنین محدودیت جدیدی ندارند.