Manifest V3'te güvenliği artırma
Bu, uzantı hizmet çalışanının parçası olmayan kod için gerekli değişiklikleri açıklayan üç bölümden sonuncudur. Uzantıların güvenliğini artırmak için yapılması gereken değişiklikler açıklanmaktadır. Diğer iki bölümde, Manifest V3'e geçmek için gereken kodunuzun güncellenmesi ve engellenen web isteklerini değiştirme ele alınmaktadır.
Rastgele dizelerin yürütülmesini kaldırma
Artık executeScript()
, eval()
ve new Function()
kullanarak harici mantığı yürütemezsiniz.
- Tüm harici kodları (JS, Wasm, CSS) uzantı paketinize taşıyın.
- Uzantı paketindeki kaynakları yüklemek için komut dosyası ve stil başvurularını güncelleyin.
- Çalışma zamanında kaynak URL'ler oluşturmak için
chrome.runtime.getURL()
aracını kullanın. - Korumalı alana alınmış bir iframe kullanın:
eval
venew Function(...)
, korumalı alana alınmış iframe'lerde desteklenmeye devam eder. Daha fazla bilgi için korumalı alana alınmış iframe'lerle ilgili kılavuzu okuyun.
executeScript()
yöntemi artık tabs
ad alanı yerine scripting
ad alanındadır. Aramaları güncelleme hakkında bilgi için executeScript()
adlı cihazı taşıma başlıklı makaleye bakın.
Rastgele dizeler yürütmenin yine de mümkün olduğu birkaç özel durum vardır:
- insertCSS kullanarak uzaktan barındırılan stil sayfalarını web sayfasına ekleme
chrome.devtools
kullanan uzantılar için: inspectWindow.eval denetlenen sayfa bağlamında JavaScript'in yürütülmesine olanak tanır.- Hata ayıklayıcı uzantıları, hata ayıklama hedefinde JavaScript yürütmek için chrome.debugger.sendCommand komutunu kullanabilir.
Uzaktan barındırılan kodu kaldır
Manifest V3'te, uzantınızın mantığının tamamı, uzantı paketinin bir parçası olmalıdır. Artık Chrome Web Mağazası politikasına göre uzaktan barındırılan dosyaları yükleyemez ve yürütemezsiniz. Örnekler:
- Geliştiricinin sunucusundan alınan JavaScript dosyaları.
- CDN'de barındırılan herhangi bir kitaplık.
- Uzaktan barındırılan kodu dinamik olarak getiren, paket haline getirilmiş üçüncü taraf kitaplıkları.
Kullanım alanınıza ve uzaktan barındırma nedeninize bağlı olarak alternatif yaklaşımlar mevcuttur. Bu bölümde, dikkate alınması gereken yaklaşımlar açıklanmaktadır. Uzaktan barındırılan kodlarla ilgili sorun yaşıyorsanız yönergelerden yararlanabilirsiniz.
Yapılandırma odaklı özellikler ve mantık
Uzantınız, çalışma zamanında uzak bir yapılandırmayı (örneğin bir JSON dosyası) yükleyip önbelleğe alır. Hangi özelliklerin etkinleştirileceğini önbelleğe alınan yapılandırma belirler.
Uzak bir hizmetle harici mantık
Uzantınız uzak bir web hizmetini çağırır. Bu, kodu gizli tutmanıza ve gerektiğinde kodu değiştirmenize olanak tanırken Chrome Web Mağazası'na yeniden gönderme ek yükünü ortadan kaldırır.
Uzaktan barındırılan kodu korumalı alana alınmış bir iframe'e yerleştirme
Uzaktan barındırılan kodlar korumalı iframe'lerde desteklenir. Kod, yerleştirilmiş sayfanın DOM'una erişim gerektiriyorsa bu yaklaşımın işe yaramayacağını unutmayın.
Üçüncü taraf kitaplıkları paket haline getirin
Daha önce harici bir sunucudan yüklediğiniz React veya Önyükleme gibi popüler bir çerçeve kullanıyorsanız küçültülmüş dosyaları indirebilir, projenize ekleyebilir ve yerel olarak içe aktarabilirsiniz. Örneğin:
<script src="./react-dom.production.min.js"></script>
<link href="./bootstrap.min.css" rel="stylesheet">
Service Worker'a kitaplık eklemek için, manifest dosyasında "background.type"
anahtarını "module"
olarak ayarlayın ve import
ifadesi kullanın.
Sekme enjekte edilen komut dosyalarında harici kitaplıkları kullanma
Ayrıca, scripting.executeScript()
çağırırken harici kitaplıkları çalışma zamanında files
dizisine ekleyerek de yükleyebilirsiniz. Çalışma zamanında verileri yine de uzaktan yükleyebilirsiniz.
chrome.scripting.executeScript({
target: {tabId: tab.id},
files: ['jquery-min.js', 'content-script.js']
});
İşlev ekleme
Daha fazla dinamikliğe ihtiyacınız varsa scripting.executeScript()
içindeki yeni func
özelliği, içerik komut dosyası olarak işlev eklemenize ve args
özelliğini kullanarak değişkenleri aktarmanıza olanak tanır.
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], });
Chrome Extension Samples deposu, adım adım ilerleyebileceğiniz bir işlev yerleştirme örneği içerir. Bu işlevin başvurusunda bir getCurrentTab()
örneği verilmiştir.
Başka geçici çözümler arayın
Önceki yaklaşımlar kullanım alanınıza yardımcı olmadıysa alternatif bir çözüm bulmanız (ör. farklı bir kitaplığa geçiş yapmanız) veya kitaplığın işlevlerini kullanmanın başka yollarını bulmanız gerekebilir. Örneğin, Google Analytics söz konusu olduğunda, Google Analytics 4 kılavuzumuzda açıklandığı şekilde, uzaktan barındırılan resmi JavaScript sürümünü kullanmak yerine Google Measurement Protocol'e geçebilirsiniz.
İçerik güvenliği politikasını güncelleme
"content_security_policy"
, manifest.json
dosyasından kaldırılmadı ancak artık iki özelliği destekleyen bir sözlük haline geldi: "extension_pages"
ve "sandbox"
.
{ ... "content_security_policy": "default-src 'self'" ... }
{ ... "content_security_policy": { "extension_pages": "default-src 'self'", "sandbox": "..." } ... }
extension_pages
: HTML dosyaları ve hizmet çalışanları dahil olmak üzere uzantınızdaki bağlamları belirtir.
sandbox
: Uzantınızın kullandığı korumalı alan kapsamındaki uzantı sayfalarını belirtir.
Desteklenmeyen içerik güvenliği politikalarını kaldırın
Manifest V3, "extension_pages"
alanında Manifest V2'de izin verilen belirli içerik güvenliği politikası değerlerine izin vermiyor. Özellikle Manifest V3, uzaktan kod yürütülmesine izin verenlere izin vermez. script-src,
object-src
ve worker-src
yönergeleri yalnızca aşağıdaki değerleri içerebilir:
self
none
wasm-unsafe-eval
- Yalnızca paketlenmemiş uzantılar: herhangi bir localhost kaynağı (
http://localhost
,http://127.0.0.1
veya bu alanlardaki herhangi bir bağlantı noktası)
sandbox
için içerik güvenliği politikası değerlerinde böyle yeni kısıtlamalar yok.