Manifest V3'te güvenliği artırma
Bu, uzantı hizmeti çalışanı kapsamında olmayan kod için gereken değişiklikleri açıklayan üç bölümden sonuncusudur. Uzantıların güvenliğini artırmak için gereken değişiklikler açıklanmaktadır. Diğer iki bölümde ise Manifest V3'e yükseltmek için gereken kodunuzu güncelleme ve engelleyici web isteklerini değiştirme konuları ele alınmaktadır.
Rastgele dizelerin yürütülmesini kaldırma
Artık executeScript(), eval() ve new Function() kullanarak harici mantık yürütemezsiniz.
- Tüm harici kodu (JS, Wasm, CSS) uzantı paketinize taşıyın.
- Kaynakları uzantı paketinden yüklemek için komut dosyası ve stil referanslarını güncelleyin.
- Çalışma zamanında kaynak URL'leri oluşturmak için
browser.runtime.getURL()kullanın. - Korumalı alan iframe'i kullanın:
evalvenew Function(...), korumalı alan iframe'lerinde hâlâ desteklenmektedir. Daha fazla bilgi için korumalı alan iframe'leri hakkındaki kılavuzu inceleyin.
executeScript() yöntemi artık tabs ad alanı yerine scripting ad alanında yer alıyor. Çağrıları güncelleme hakkında bilgi için Taşıma executeScript() başlıklı makaleyi inceleyin.
Rastgele dizelerin yürütülmesinin hâlâ mümkün olduğu birkaç özel durum vardır:
- insertCSS kullanarak uzaktan barındırılan stil sayfalarını bir web sayfasına yerleştirme
browser.devtoolskullanan uzantılar için: inspectWindow.eval, incelenen sayfanın bağlamında JavaScript'in yürütülmesine olanak tanır.- Hata ayıklayıcı uzantıları, hata ayıklama hedefinde JavaScript'i yürütmek için browser.debugger.sendCommand'ı kullanabilir.
Uzaktan barındırılan kodu kaldırma
Manifest V3'te uzantınızın tüm mantığı, uzantı paketinin bir parçası olmalıdır. Chrome Web Mağazası politikası uyarınca artık uzaktan barındırılan dosyaları yükleyip çalıştıramazsınız. Örnekler:
- Geliştiricinin sunucusundan çekilen JavaScript dosyaları.
- CDN'de barındırılan tüm kitaplıklar.
- Uzakta barındırılan kodu dinamik olarak getiren paketlenmiş üçüncü taraf kitaplıkları.
Kullanım alanınıza ve uzaktan barındırmanın nedenine 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 rehberliğimizden yararlanabilirsiniz.
Yapılandırmaya dayalı özellikler ve mantık
Uzantınız, çalışma zamanında uzak bir yapılandırmayı (ör. JSON dosyası) yükleyip önbelleğe alıyor. Hangi özelliklerin etkinleştirileceğini önbelleğe alınmış yapılandırma belirler.
Uzak hizmetle haricileştirilmiş mantık
Uzantınız uzak bir web hizmetini çağırıyor. Bu sayede, kodu gizli tutabilir ve gerektiğinde değiştirebilirsiniz. Ayrıca, Chrome Web Mağazası'na yeniden gönderme işleminin ek yükünden de kurtulursunuz.
Uzakta barındırılan kodu korumalı alana alınmış bir iframe'e yerleştirme
Uzaktan barındırılan kod korumalı alana alınmış iframe'lerde desteklenir. Kodun yerleştirme sayfasının DOM'una erişmesi gerekiyorsa bu yaklaşımın işe yaramayacağını lütfen unutmayın.
Üçüncü taraf kitaplıklarını paketleme
Daha önce harici bir sunucudan yüklediğiniz React veya Bootstrap gibi popüler bir çerçeve kullanıyorsanız küçültülmüş dosyaları indirip 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">
Bir kitaplığı hizmet çalışanı'na dahil etmek için manifest dosyasında "background.type" anahtarını "module" olarak ayarlayın ve import ifadesini kullanın.
Sekmeye yerleştirilmiş komut dosyalarında harici kitaplıkları kullanma
scripting.executeScript() çağrılırken files dizisine ekleyerek harici kitaplıkları çalışma zamanında da yükleyebilirsiniz. Çalışma zamanında verileri uzaktan yüklemeye devam edebilirsiniz.
browser.scripting.executeScript({
target: {tabId: tab.id},
files: ['jquery-min.js', 'content-script.js']
});
İşlev ekleme
Daha fazla dinamizme ihtiyacınız varsa scripting.executeScript() içindeki yeni func özelliği, bir işlevi içerik komut dosyası olarak yerleştirmenize ve args özelliğini kullanarak değişkenleri iletmenize olanak tanır.
let name = 'World!'; browser.tabs.executeScript({ code: `alert('Hello, ${name}!')` });
Arka plan komut dosyası içinde.
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], });
Arka planda hizmet çalışanı.
Chrome Extension Samples repo'da, adım adım inceleyebileceğiniz bir işlev yerleştirme örneği bulunur. getCurrentTab() örneği, ilgili işlevin referansında yer alır.
Diğer geçici çözümleri arama
Önceki yaklaşımlar kullanım alanınızda yardımcı olmuyorsa alternatif bir çözüm bulmanız (ör. farklı bir kitaplığa geçiş yapma) veya kitaplığın işlevselliğini 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ığı gibi resmi uzaktan barındırılan 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 "extension_pages" ve "sandbox" olmak üzere iki özelliği destekleyen bir sözlük.
{ ... "content_security_policy": "default-src 'self'" ... }
{ ... "content_security_policy": { "extension_pages": "default-src 'self'", "sandbox": "..." } ... }
extension_pages: HTML dosyaları ve servis çalışanları dahil olmak üzere uzantınızdaki bağlamları ifade eder.
sandbox: Uzantınızın kullandığı tüm korumalı alana alınmış uzantı sayfalarını ifade eder.
Desteklenmeyen içerik güvenlik politikalarını kaldırma
Manifest V3, Manifest V2'de izin verilen "extension_pages" alanındaki belirli içerik güvenliği politikası değerlerine izin vermez. Özellikle Manifest V3, uzaktan kod yürütmeye izin verenleri yasaklar. script-src, object-src ve worker-src yönergeleri yalnızca aşağıdaki değerlere sahip olabilir:
selfnonewasm-unsafe-eval- Yalnızca paketlenmemiş uzantılar: Herhangi bir localhost kaynağı (
http://localhost,http://127.0.0.1veya bu alan adlarındaki herhangi bir bağlantı noktası)
sandbox için içerik güvenlik politikası değerlerinde bu tür yeni kısıtlamalar yoktur.