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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

کد میزبانی شده از راه دور را در یک iframe سندباکس شده جاسازی کنید

کد میزبانی‌شده از راه دور در iframeهای sandboxed پشتیبانی می‌شود . لطفاً توجه داشته باشید که اگر کد نیاز به دسترسی به 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 ارسال کنید.

مانیفست نسخه ۲
let name = 'World!';
chrome.tabs.executeScript({
  code: `alert('Hello, ${name}!')`
});

در یک فایل اسکریپت پس‌زمینه.

مانیفست نسخه ۳
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],
});

در پس‌زمینه، سرویس ورکر.

مخزن نمونه‌های افزونه‌های کروم شامل یک مثال تزریق تابع است که می‌توانید آن را به صورت مرحله‌ای بررسی کنید. مثالی از getCurrentTab() در مرجع آن تابع وجود دارد.

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

اگر رویکردهای قبلی به مورد استفاده شما کمکی نمی‌کنند، ممکن است مجبور شوید یا یک راه‌حل جایگزین پیدا کنید (یعنی به یک کتابخانه دیگر مهاجرت کنید) یا راه‌های دیگری برای استفاده از قابلیت‌های کتابخانه پیدا کنید. به عنوان مثال، در مورد گوگل آنالیتیکس، می‌توانید به جای استفاده از نسخه رسمی جاوا اسکریپت میزبانی شده از راه دور، همانطور که در راهنمای گوگل آنالیتیکس ۴ ما توضیح داده شده است، به پروتکل اندازه‌گیری گوگل تغییر دهید.

به‌روزرسانی سیاست امنیتی محتوا

"content_security_policy" از فایل manifest.json حذف نشده است، اما اکنون یک دیکشنری است که از دو ویژگی پشتیبانی می‌کند: "extension_pages" و "sandbox" .

مانیفست نسخه ۲
{
  ...
  "content_security_policy": "default-src 'self'"
  ...
}
مانیفست نسخه ۳
{
  ...
  "content_security_policy": {
    "extension_pages": "default-src 'self'",
    "sandbox": "..."
  }
  ...
}

extension_pages : به contextهای موجود در افزونه شما، از جمله فایل‌های html و service workerها، اشاره دارد.

sandbox : به هر صفحه افزونه‌ای که در محیط sandbox قرار گرفته و افزونه شما از آن استفاده می‌کند، اشاره دارد.

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

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

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

مقادیر سیاست امنیتی محتوا برای sandbox چنین محدودیت‌های جدیدی ندارند.