بهبود امنیت در «مانیفست نسخه ۳»
این آخرین بخش از سه بخشی است که تغییرات لازم برای کدی را که بخشی از کارگر سرویس افزونه نیست شرح میدهد. این سند تغییرات لازم برای بهبود امنیت افزونهها را شرح میدهد. دو بخش دیگر به بهروزرسانی کد موردنیاز برای ارتقا به «مانیفست نسخه ۳» و جایگزینی درخواستهای وب مسدودکننده میپردازد.
برداشتن اجرای رشتههای دلخواه
دیگر نمیتوانید بااستفاده از executeScript()، eval()، و new Function() منطق خارجی را اجرا کنید.
- همه کد خارجی (JS، Wasm، CSS) را به بسته افزونهتان منتقل کنید.
- مرجعهای سبک و دستورگان را بهروزرسانی کنید تا منابع از بسته افزونه بار شود.
- از
browser.runtime.getURL()برای ساختن نشانیهای وب منبع در زمان اجرا استفاده کنید. - از iframe جعبه شنی استفاده کنید:
evalوnew Function(...)همچنان در iframeهای جعبه شنی پشتیبانی میشوند. برای جزئیات بیشتر، راهنمای iframeهای جعبه امن را بخوانید.
روش executeScript() اکنون در فضای نام scripting بهجای فضای نام tabs قرار دارد. برای اطلاعات درباره بهروزرسانی تماسها، انتقال executeScript() را ببینید.
چند مورد خاص وجود دارد که در آنها اجرای رشتههای دلخواه همچنان امکانپذیر است:
- تزریق برگههای سبک میزبانیشده از راه دور در صفحه وب بااستفاده از insertCSS
- برای افزونههایی که از
browser.devtoolsاستفاده میکنند: inspectWindow.eval اجازه میدهد جاوا اسکریپت در بافت صفحه بازرسیشده اجرا شود. - افزونههای اشکالزدا میتوانند از browser.debugger.sendCommand برای اجرای جاوا اسکریپت در هدف اشکالزدایی استفاده کنند.
برداشتن کد میزبانیشده از راه دور
در «مانیفست نسخه ۳»، همه منطقهای افزونه شما باید بخشی از بسته افزونه باشد. طبق خطمشی «نتبازار Chrome»، دیگر نمیتوانید فایلهای میزبانیشده از دور را بار و اجرا کنید. چند نمونه:
- فایلهای JavaScript از سرور توسعهدهنده کشیده شده است.
- هر کتابخانهای که در CDN میزبانی میشود.
- کتابخانههای طرف سوم دستهبندیشده که کد میزبانیشده از دور را بهصورت پویا واکشی میکنند.
بسته به مورد استفاده و دلیل میزبانی از دور، رویکردهای جایگزین دردسترس است. این بخش رویکردهایی را که باید درنظر بگیرید شرح میدهد. اگر در کار با کد میزبانیشده از دور مشکل دارید، راهنماییهایی دردسترس داریم.
ویژگیها و منطق پیکربندیمحور
افزونه شما پیکربندی از دور (برای مثال فایل JSON) را در زمان اجرا بار میکند و در حافظه نهان ذخیره میکند. پیکربندی ذخیرهشده در حافظه نهان تعیین میکند که کدام ویژگیها فعال شوند.
منطق برونسپاریشده با خدمات از دور
افزونه شما سرویس وب ازراهدوری را فرا میخواند. این کار به شما امکان میدهد کد را خصوصی نگه دارید و درصورت نیاز آن را تغییر دهید و درعینحال از سربار اضافی ارسال مجدد به «نتبازار Chrome» جلوگیری کنید.
جاسازی کد میزبانیشده از دور در iframe جعبه شنی
کد میزبانیشده از دور در 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() بار کنید. همچنان میتوانید دادهها را از دور در زمان اجرا بار کنید.
browser.scripting.executeScript({
target: {tabId: tab.id},
files: ['jquery-min.js', 'content-script.js']
});
تزریق تابع
اگر به پویایی بیشتری نیاز دارید، دارایی جدید func در scripting.executeScript() به شما امکان میدهد تابعی را بهعنوان یک دستورگان محتوا تزریق کنید و متغیرها را بااستفاده از دارایی args ارسال کنید.
let name = 'World!'; browser.tabs.executeScript({ code: `alert('Hello, ${name}!')` });
در فایل دستورگان پسزمینهای.
async function getCurrentTab() {/* ... */} let tab = await getCurrentTab(); function showAlert(givenName) { alert(`Hello, ${givenName}`); } let name = 'World'; browser.scripting.executeScript({ target: {tabId: tab.id}, func: showAlert, args: [name], });
در عامل خدماتی پسزمینه.
مخزن نمونههای افزونه Chrome حاوی نمونه تزریق تابع است که میتوانید آن را گامبهگام دنبال کنید. مثالی از getCurrentTab() در مرجع آن تابع وجود دارد.
بهدنبال راهکارهای دیگر باشید
اگر رویکردهای قبلی برای مورد استفاده شما مفید نیستند، ممکن است مجبور شوید یا راهحل جایگزینی پیدا کنید (یعنی به کتابخانه دیگری مهاجرت کنید) یا روشهای دیگری برای استفاده از عملکرد کتابخانه پیدا کنید. برای مثال، در مورد Google Analytics، میتوانید بهجای استفاده از نسخه رسمی JavaScript که از دور میزبانی میشود، همانطور که در راهنمای Google Analytics 4 ما توضیح داده شده است، به پروتکل اندازهگیری Google تغییر دهید.
بهروزرسانی خطمشی امنیت محتوا
"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: به زمینههایی در افزونه شما، ازجمله فایلهای html و کارگزاران خدمات، اشاره دارد.
sandbox: به هر صفحه افزونه جعبه ایمنی که افزونه شما استفاده میکند اشاره دارد.
خطمشیهای امنیتی محتوای پشتیبانینشده را بردارید
«مانیفست نسخه ۳» مقادیر خاصی از خطمشی امنیتی محتوا را در فیلد "extension_pages" که در «مانیفست نسخه ۲» مجاز بود، غیرمجاز میداند. بهطور خاص، «مانیفست نسخه ۳» برنامههایی را که اجازه اجرای کد از راه دور میدهند مجاز نمیداند. دستورهای script-src, object-src، و worker-src فقط میتوانند مقادیر زیر را داشته باشند:
selfnonewasm-unsafe-eval- فقط افزونههای ازهم بازشده: هر منبع میزبان محلی، (
http://localhost،http://127.0.0.1، یا هر درگاهی در آن دامنهها)
مقادیر خطمشی امنیت محتوا برای sandbox چنین محدودیتهای جدیدی ندارد.