Uzantı güvenliğini iyileştirin

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: eval ve new 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:

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.

Manifest V2
let name = 'World!';
browser.tabs.executeScript({
  code: `alert('Hello, ${name}!')`
});

Arka plan komut dosyası içinde.

Manifest V3
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.

Manifest V2
{
  ...
  "content_security_policy": "default-src 'self'"
  ...
}
Manifest V3
{
  ...
  "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:

  • self
  • none
  • wasm-unsafe-eval
  • Yalnızca paketlenmemiş uzantılar: Herhangi bir localhost kaynağı (http://localhost, http://127.0.0.1 veya 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.