Uzantı güvenliğini iyileştirin

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

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.

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

Arka plandaki bir komut dosyası.

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

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".

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