Eğitim: Manifest V2'ye Taşıma

Manifest 1 sürümü, Chrome 18'de kullanımdan kaldırıldı ve manifest 1 sürümü destek programına göre desteği sonlandırılacak. 1. sürümden 2. sürüme yapılan değişiklikler iki geniş kategoriye ayrılır: API değişiklikleri ve güvenlik değişiklikleri.

Bu dokümanda, Chrome uzantılarınızı manifest 1 sürümünden 2 sürümüne taşımayla ilgili yapılacaklar listeleri ve bu değişikliklerin ne anlama geldiği ve neden yapıldığıyla ilgili daha ayrıntılı özetler yer almaktadır.

API değişiklikleri yapılacaklar listesi

  • browser_actions mülkünü mü yoksa chrome.browserActions API'sini mi kullanıyorsunuz?

  • browser_actions değerini tekil browser_action mülküyle değiştirin.

  • chrome.browserActions yerine chrome.browserAction yazın.

  • icons özelliğini default_icon ile değiştirin.

  • name özelliğini default_title ile değiştirin.

  • popup mülkünü default_popup ile değiştirin (bu, artık bir dize olmalıdır).

  • page_actions mülkünü mü yoksa chrome.pageActions API'sini mi kullanıyorsunuz?

  • page_actions yerine page_action yazın.

  • chrome.pageActions yerine chrome.pageAction yazın.

  • icons özelliğini default_icon ile değiştirin.

  • name özelliğini default_title ile değiştirin.

  • popup mülkünü default_popup ile değiştirin (bu, artık bir dize olmalıdır).

  • chrome.self mülkünü kullanıyor musunuz?

  • chrome.extension ile değiştirin.

  • Port.tab mülkünü kullanıyor musunuz?

  • Port.sender ile değiştirin.

  • chrome.extension.getTabContentses() veya chrome.extension.getExtensionTabs() API'lerini mi kullanıyorsunuz?

  • chrome.extension.getViews( { "type" : "tab" } ) ile değiştirin.

  • Uzantınız arka plan sayfası kullanıyor mu?

  • background_page mülkünü background mülküyle değiştirin.

  • Sayfanın kodunu içeren bir scripts veya page özelliği ekleyin.

  • Arka plan sayfanızı etkinlik sayfasına dönüştürmek için bir persistent mülkü ekleyin ve false olarak ayarlayın

Güvenlik değişiklikleri yapılacaklar listesi

  • HTML sayfalarında satır içi komut dosyası blokları kullanıyor musunuz?

  • <script> etiketlerinde bulunan JS kodunu kaldırın ve harici bir JS dosyasına yerleştirin.

  • Satır içi etkinlik işleyiciler (onclick gibi) kullanıyor musunuz?

  • Bunları HTML kodundan kaldırın, harici bir JS dosyasına taşıyın ve bunun yerine addEventListener() kullanın.

  • Uzantı, uzantının paketinde bulunan kaynaklara (ör. resimler ve komut dosyaları) erişmesi gereken web sayfalarına içerik komut dosyaları enjekte ediyor mu?

  • web_accessible_resources mülkünü tanımlayın ve kaynakları (ve isteğe bağlı olarak bu kaynaklar için ayrı bir İçerik Güvenliği Politikası) listeleyin.

  • Uzantı, harici web sayfaları yerleştiriyor mu?

  • sandbox mülkünü tanımlayın.

  • Kodunuz veya kitaplığınız eval(), yeni Function(), innerHTML, setTimeout() kullanıyor mu ya da dinamik olarak değerlendirilen JS kodu dizeleri mi iletiyor?

  • JSON kodunu bir nesneye ayrıştırıyorsanız JSON.parse() kullanın.

  • AngularJS gibi CSP uyumlu bir kitaplık kullanın.

  • Manifestinizde bir korumalı alan girişi oluşturun ve korumalı alan sayfasıyla iletişim kurmak için postMessage()'ü kullanarak etkilenen kodu korumalı alanda çalıştırın.

  • jQuery veya Google Analytics gibi harici kodlar yüklüyor musunuz?

  • Kitaplığı indirip uzantınıza paketleyebilir ve ardından yerel paketten yükleyebilirsiniz.

  • Manifestinizin "content_security_policy" bölümünde kaynağı sunan HTTPS alanını izin verilenler listesine ekleyin.

API değişikliklerinin özeti

Manifest 2 sürümünde, tarayıcı işlemi ve sayfa işlemi API'lerinde birkaç değişiklik yapıldı ve birkaç eski API yenileriyle değiştirildi.

Tarayıcı işlemlerinde yapılan değişiklikler

Tarayıcı işlemleri API'sinde bazı adlandırma değişiklikleri yapılmıştır:

  • browser_actions ve chrome.browserActions özellikleri, tekil karşılıkları browser_action ve chrome.browserAction ile değiştirildi.
  • Eski browser_actions mülkünün altında icons, name ve popup mülkleri vardı. Bunlar şu şekilde değiştirildi:

  • Tarayıcı işlemi rozeti simgesi için default_icon

  • Rozetin üzerine geldiğinizde ipucu metninde görünen metin için default_name

  • Tarayıcı işleminin kullanıcı arayüzünü temsil eden HTML sayfası için default_popup (bu artık bir dize olmalı, nesne olamaz)

Sayfa işlemlerinde yapılan değişiklikler

Tarayıcı işlemlerinde yapılan değişikliklere benzer şekilde sayfa işlemleri API'si de değiştirildi:

  • page_actions ve chrome.pageActions özellikleri, tekil karşılıkları page_action ve chrome.pageAction ile değiştirildi.
  • Eski page_actions mülkünün altında icons, name ve popup mülkleri vardı. Bunlar şu şekilde değiştirildi:

  • Sayfa işlemi rozeti simgesi için default_icon

  • Rozetin üzerine geldiğinizde ipucu metninde görünen metin için default_name

  • Sayfa işleminin kullanıcı arayüzünü temsil eden HTML sayfası için default_popup (bu artık bir dize olmalı, nesne olamaz)

Kaldırılan ve değiştirilen API'ler

Birkaç uzantı API'si kaldırıldı ve yenileriyle değiştirildi:

  • background_page mülkü, background ile değiştirildi.
  • chrome.self mülkü kaldırıldı. chrome.extension'ü kullanın.
  • Port.tab mülkü, Port.sender ile değiştirildi.
  • chrome.extension.getTabContentses() ve chrome.extension.getExtensionTabs() API'leri chrome.extension.getViews( { "type" : "tab" } ) ile değiştirildi.

Güvenlik değişikliklerinin özeti

Manifest 1 sürümünden 2 sürümüne geçişle birlikte güvenlikle ilgili çeşitli değişiklikler yapıldı. Bu değişikliklerin çoğu, Chrome'un İçerik Güvenliği Politikası'nı benimsemesinden kaynaklanmaktadır. Bu politikanın sonuçlarını anlamak için daha fazla bilgi edinmeniz gerekir.

Satır içi komut dosyalarına ve etkinlik işleyicilere izin verilmiyor

İçerik Güvenliği Politikası'nın kullanılması nedeniyle artık HTML içeriğiyle satır içi <script> etiketleri kullanamazsınız. Bunlar harici JS dosyalarına taşınmalıdır. Ayrıca satır içi etkinlik işleyiciler de desteklenmez. Örneğin, uzantınızda aşağıdaki kodun bulunduğunu varsayalım:

<html>
<head>
  <script>
    function myFunc() { ... }
  </script>
</head>
</html>

Bu kod, çalışma zamanında bir hataya neden olur. Bu sorunu düzeltmek için <script> etiketi içeriklerini harici dosyalara taşıyın ve bunlara src='path_to_file.js' özelliğiyle referans verin.

Benzer şekilde, birçok web geliştiricisi tarafından kullanılan yaygın bir durum ve kolaylık özelliği olan satır içi etkinlik işleyicileri de yürütülmez. Örneğin, aşağıdakiler gibi yaygın örnekleri göz önünde bulundurabilirsiniz:

<body onload="initialize()">
<button onclick="handleClick()" id="button1">

Bunlar manifest V2 uzantılarında çalışmaz. Satır içi etkinlik işleyicileri kaldırın, harici JS dosyanıza yerleştirin ve bunların yerine etkinlik işleyicileri kaydetmek için addEventListener() kullanın. Örneğin, JS kodunuzda şunları kullanın:

window.addEventListener("load", initialize);
...
document.getElementById("button1").addEventListener("click",handleClick);

Bu, uzantınızın davranışını kullanıcı arayüzü işaretlemesinden ayırmanın çok daha temiz bir yoludur.

İçerik yerleştirme

Uzantılarınızın harici olarak kullanılabilen veya harici bir kaynaktan gelen içerikleri yerleştirebileceği bazı senaryolar vardır.

Web sayfalarındaki uzantı içeriği: Uzantı, web sayfalarına yerleştirilen içerik komut dosyalarında kullanılan kaynakları (ör. resimler, komut dosyası, CSS stilleri vb.) yerleştiriyorsa bu kaynakları harici web sayfalarının kullanabilmesi için izin verilenler listesine eklemek üzere web_accessible_resources mülkünü kullanmanız gerekir:

{
...
  "web_accessible_resources": [
    "images/image1.png",
    "script/myscript.js"
  ],
...
}

Harici içerik yerleştirme: İçerik Güvenliği Politikası yalnızca paketinizden yerel komut dosyasının ve nesnelerin yüklenmesine izin verir. Bu sayede, harici saldırganların uzantınıza bilinmeyen kod eklemesi engellenir. Ancak jQuery veya Google Analytics kodu gibi harici olarak sunulan kaynakları yüklemek istediğiniz durumlar da vardır. Bunu yapmanın iki yolu vardır:

  1. İlgili kitaplığı (ör. jQuery) yerel olarak indirin ve uzantınıza ekleyin.
  2. Manifestinizin "content_security_policy" bölümünde HTTPS kaynaklarını izin verilenler listesine ekleyerek İGP'yi sınırlı bir şekilde gevşetebilirsiniz. Google Analytics gibi bir kitaplığı dahil etmek için aşağıdaki yaklaşımı benimsemeniz gerekir:

    {
      ...,
      "content_security_policy": "script-src 'self'
      https://ssl.google-analytics.com; object-src 'self'",
      ...
    }
    

Dinamik komut dosyası değerlendirmesini kullanma

Yeni manifest v2 şemasında yapılan en büyük değişikliklerden biri, uzantıların artık eval() veya yeni Function() gibi dinamik komut dosyası değerlendirme tekniklerini kullanamamasıdır. Ayrıca, setTimeout() gibi bir eval() kullanılmasına neden olacak işlevlere JS kod dizeleri iletemeyecektir. Ayrıca, Google Haritalar ve belirli şablon kitaplıkları gibi yaygın olarak kullanılan bazı JavaScript kitaplıklarının bu tekniklerden bazılarını kullandığı bilinmektedir.

Chrome, sayfaların kendi kaynaklarında çalışması için bir korumalı alan sağlar. Bu sayfaların Chrome'a erişimi reddedilir.* API'ler. Yeni İçerik Güvenliği Politikası kapsamında eval() ve benzeri öğeleri kullanmak için:

  1. Manifest dosyanızda korumalı alan girişi oluşturun.
  2. Korumalı alan girişinde, korumalı alanda çalıştırmak istediğiniz sayfaları listeleyin.
  3. Korumalı alan sayfasıyla iletişim kurmak için postMessage() üzerinden mesaj aktarımı kullanın.

Bunun nasıl yapılacağıyla ilgili daha fazla bilgi için Sandboxing Eval belgelerine bakın.

Daha fazla bilgi

Manifest 2 sürümündeki değişiklikler, geliştiricilerin daha güvenli ve sağlam bir mimariye sahip uzantılar ve uygulamalar oluşturmasına rehberlik etmek için tasarlanmıştır. Manifest 1. sürümünden 2. sürüme yapılan değişikliklerin tam listesini görmek için manifest dosyası dokümanlarını inceleyin. Güvenli olmayan kodu izole etmek için korumalı alanı kullanma hakkında daha fazla bilgi için sandboxing eval makalesini okuyun. İçerik Güvenliği Politikası hakkında daha fazla bilgi edinmek için uzantılarla ilgili eğitici içeriğimizi ve HTML5Rocks'taki iyi bir girişi ziyaret edebilirsiniz.