Manifest V3'te güvenliği iyileştirme
Bu, uzantı hizmeti çalışanının parçası olmayan kod için gereken değişiklikleri açıklayan üç bölümden sonuncudur. Bu dokümanda, uzantıların güvenliğini iyileştirmek için gereken değişiklikler açıklanmaktadır. Diğer iki bölümde ise Manifest V3'e yükseltme yapmak için gereken kodunuzu güncelleme ve engellenen web isteklerini değiştirme konuları ele alınmaktadır.
Rastgele dizelerin yürütülmesini kaldırın
Artık executeScript()
, eval()
ve new Function()
kullanarak harici mantık 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 referanslarını güncelleyin.
- Çalışma zamanında kaynak URL'leri 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ı alan iframe'leri kılavuzunu okuyun.
executeScript()
yöntemi artık tabs
ad alanından scripting
ad alanına taşındı. Aramaları güncelleme hakkında bilgi edinmek için executeScript()
numaralı telefonu taşıma başlıklı makaleye göz atın.
İsteğe bağlı dizelerin çalıştırılmasının hâlâ mümkün olduğu birkaç özel durum vardır:
- insertCSS işlevini kullanarak uzaktan barındırılan stil sayfalarını bir web sayfasına ekleme
chrome.devtools
kullanan uzantılar için: inspectWindow.eval, JavaScript'in incelenen sayfa bağlamında yürütülmesine olanak tanır.- Hata ayıklayıcı uzantıları, JavaScript'i bir hata ayıklama hedefinde yürütmek için chrome.debugger.sendCommand'ı kullanabilir.
Uzaktan barındırılan kodu kaldır
Manifest V3'te, uzantınızın tüm mantığı uzantı paketinin bir parçası olmalıdır. Artık Chrome Web Mağazası politikası uyarınca, 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 tüm kitaplıklar.
- Uzakta barındırılan kodu dinamik olarak getiren, gruplandırılmış üçüncü taraf kitaplıklar.
Kullanım alanınıza ve uzak barındırma nedeninize bağlı olarak alternatif yaklaşımlar mevcuttur. Bu bölümde, göz önünde bulundurulması gereken yaklaşımlar açıklanmaktadır. Uzaktan barındırılan kodla ilgili sorun yaşıyorsanız rehberlik alabilirsiniz.
Yapılandırma odaklı özellikler ve mantık
Uzantı, çalışma zamanında uzak bir yapılandırmayı (ör. JSON dosyası) yükleyip önbelleğe alır. Önbelleğe alınan yapılandırma hangi özelliklerin etkinleştirileceğini belirler.
Uzak hizmetle haricileştirilmiş mantık
Uzantı, uzak bir web hizmetini çağırıyor. Bu sayede kodu gizli tutabilir ve gerektiğinde değiştirebilir, Chrome Web Mağazası'na yeniden göndermeyle ilgili ek masraflardan kaçınabilirsiniz.
Uzaktan barındırılan kodu korumalı alana alınmış bir iframe'e yerleştirme
Uzaktan barındırılan kod, korumalı iframe'lerde desteklenir. Kod, yerleştirme sayfasının DOM'una erişim gerektiriyorsa bu yaklaşımın işe yaramayacağını lütfen unutmayın.
Üçüncü taraf kitaplıklarını paketleme
Önceden harici bir sunucudan yüklediğiniz React veya Bootstrap 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">
Bir hizmet çalışanına kitaplık eklemek için, "background.type"
anahtarını manifest dosyasında "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ısı yaparken harici kitaplıkları files
dizisine ekleyerek çalışma zamanında harici kitaplıkları da yükleyebilirsiniz. Verileri çalışma zamanında uzaktan yüklemeye devam edebilirsiniz.
chrome.scripting.executeScript({
target: {tabId: tab.id},
files: ['jquery-min.js', 'content-script.js']
});
İşlev ekle
Daha fazla dinamikliğe ihtiyacınız varsa scripting.executeScript()
içindeki yeni func
özelliği, işlevleri içerik komut dosyası olarak eklemenize ve args
özelliğini kullanarak değişkenleri aktarmanıza olanak tanır.
let name = 'World!'; chrome.tabs.executeScript({ code: `alert('Hello, ${name}!')` });
Arka plan komut dosyası dosyasında.
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], });
Arka planda hizmet çalışanında.
Chrome Uzantı Örnekleri deposu, adım adım ilerleyebileceğiniz bir işlev yerleştirme örneği içerir. Bu işleve ait referansta getCurrentTab()
örneği verilmiştir.
Diğer geçici çözümleri arayın
Önceki yaklaşımlar kullanım alanınıza yardımcı olmazsa alternatif bir çözüm bulmanız (ör. farklı bir kitaplığa geçiş yapmanız) veya kitaplığın işlevselliğini başka şekillerde kullanmanız gerekebilir. Örneğin, Google Analytics söz konusu olduğunda, Google Analytics 4 kılavuzumuzda açıklandığı gibi, 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 oldu: "extension_pages"
ve "sandbox"
.
{ ... "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ığı korumalı alanlı uzantı sayfalarını ifade eder.
Desteklenmeyen içerik güvenliği politikalarını kaldırma
Manifest V3, "extension_pages"
alanında Manifest V2'de izin verilen belirli içerik güvenliği politikası değerlerine izin vermez. Özellikle Manifest V3, uzaktan kod yürütmeye 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 yerel ana makine 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 bu tür yeni kısıtlamalar yoktur.