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ü yoksachrome.browserActions
API'sini mi kullanıyorsunuz?browser_actions
değerini tekilbrowser_action
mülküyle değiştirin.chrome.browserActions
yerinechrome.browserAction
yazın.icons
özelliğinidefault_icon
ile değiştirin.name
özelliğinidefault_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ü yoksachrome.pageActions
API'sini mi kullanıyorsunuz?page_actions
yerinepage_action
yazın.chrome.pageActions
yerinechrome.pageAction
yazın.icons
özelliğinidefault_icon
ile değiştirin.name
özelliğinidefault_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()
veyachrome.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
veyapage
özelliği ekleyin.Arka plan sayfanızı etkinlik sayfasına dönüştürmek için bir
persistent
mülkü ekleyin vefalse
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()
, yeniFunction()
,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
vechrome.browserActions
özellikleri, tekil karşılıklarıbrowser_action
vechrome.browserAction
ile değiştirildi.Eski
browser_actions
mülkünün altındaicons
,name
vepopup
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
vechrome.pageActions
özellikleri, tekil karşılıklarıpage_action
vechrome.pageAction
ile değiştirildi.Eski
page_actions
mülkünün altındaicons
,name
vepopup
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()
vechrome.extension.getExtensionTabs()
API'lerichrome.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:
- İlgili kitaplığı (ör. jQuery) yerel olarak indirin ve uzantınıza ekleyin.
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:
- Manifest dosyanızda korumalı alan girişi oluşturun.
- Korumalı alan girişinde, korumalı alanda çalıştırmak istediğiniz sayfaları listeleyin.
- 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.