Uzantı güvenliğini iyileştirin

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

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.

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

Arka plan komut dosyası dosyasında.

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

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ığı 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.