Uzantı güvenliğini iyileştirin

Manifest V3'te güvenliği iyileştirme

Bu, uzantı hizmet işçisinin parçası olmayan kod için gereken değişiklikleri açıklayan üç bölümden sonuncusudur. 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, 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ırma

Artık executeScript(), eval() ve new Function()'i kullanarak harici mantık yürütemezsiniz.

  • Tüm harici kodları (JS, Wasm, CSS) uzantı paketinize taşıyın.
  • Kaynakları uzantı paketinden yüklemek için komut dosyası ve stil referanslarını güncelleyin.
  • Kaynak URL'lerini çalışma zamanında oluşturmak için chrome.runtime.getURL() öğesini 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()'yi taşıma başlıklı makaleyi inceleyin.

İ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ı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 alınan JavaScript dosyaları.
  • CDN'de barındırılan tüm kitaplıklar.
  • Uzak barındırılan kodu dinamik olarak getiren paketlenmiş üçü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, dikkate alabileceğiniz 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ı alana alınmış 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

React veya Bootstrap gibi popüler bir çerçeve kullanıyorsanız ve bu çerçeveyi daha önce harici bir sunucudan yüklüyorsanız sıkıştırı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 işçisine kitaplık eklemek için manifest dosyasında "background.type" anahtarını "module" olarak ayarlayın ve bir import ifadesi kullanın.

Sekme içine yerleştirilmiş komut dosyalarında harici kitaplıkları kullanma

Harici kitaplıkları, scripting.executeScript() çağrısını yaparken files dizisine ekleyerek de çalışma zamanında 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 ekleme

Daha fazla dinamizme ihtiyacınız varsa scripting.executeScript() içindeki yeni func mülkü, bir işlevi içerik komut dosyası olarak eklemenize ve args mülkünü kullanarak değişkenleri iletmenize 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 plan hizmet işçisinde.

Chrome Uzantısı Örnekleri deposu, adım adım uygulayabileceğiniz bir işlev ekleme örneği içerir. getCurrentTab() örneği, ilgili işlevin referansında yer alır.

Diğer geçici çözümleri arayın

Önceki yaklaşımlar kullanım alanınızda işe yaramazsa alternatif bir çözüm (ör. farklı bir kitaplığa taşıma) veya kitaplığın işlevini 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 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üktür: "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ılarınızın kullandığı korumalı alanlardaki 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ğerlere sahip olabilir:

  • self
  • none
  • wasm-unsafe-eval
  • Yalnızca paketi açılmamış 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.