Chrome uzantılarında değerlendirmeyi kullanma

Chrome'un uzantı sistemi oldukça katı bir varsayılan İçerik Güvenliği Politikası (İGP) uygular. Politika kısıtlamaları basittir: Komut dosyası, satır dışına taşınarak ayrı JavaScript dosyaları, satır içi etkinlik işleyiciler addEventListener kullanacak şekilde dönüştürülmelidir ve eval() devre dışı bırakıldı. Chrome Uygulamaları'nın daha da sıkı bir politikası vardır ve özellikleri hakkında daha fazla bilgi edinin.

Bununla birlikte, çeşitli kütüphanelerin eval() ve eval benzeri yapıları kullandığının farkındayız: Performans optimizasyonu ve ifade kolaylığı için new Function(). Şablon oluşturma kitaplıkları bu uygulama tarzına çok açıktır. Bazıları (Angular.js gibi) İGP'yi destekler. Çoğu popüler çerçeve, henüz deneme sürümüyle uyumlu olmayan bir mekanizmaya uzantıları eval daha az dünya. Bu nedenle, söz konusu işlev için desteğin kaldırılması daha fazla beklenenden fazla soruna neden olabilir.

Bu dokümanda, bu kitaplıkları projelerinize dahil etmek için güvenli bir mekanizma olarak korumalı alan kullanımı tanıtılmaktadır. hiçbir zaman ödün vermeden kullanabilirsiniz. Kısaca uzantılar terimini kullanacağız ancak ve bu kavram uygulamalar için de aynı şekilde geçerlidir.

Neden korumalı alan kullanmalı?

eval, yürüttüğü bir kod uzantıdaki her şeye erişebildiğinden bu uzantı içinde tehlikeli bir durum eklentisinin yüksek izinli ortamını yönetebilirsiniz. Şunları yapabilecek bir grup güçlü chrome.* API'si mevcuttur: Kullanıcının güvenliğini ve gizliliğini ciddi şekilde etkileme; endişelenmemizin en az olduğu şey basit veri hırsızlığı. Sunulan çözüm, eval ürününün genişletmenin verileri veya uzantının yüksek değerli API'leri. Veri yok, API yok, sorun değil.

Bu işlemi, uzantı paketinin içindeki belirli HTML dosyalarının korumalı alana alınmış olarak listeleyerek gerçekleştiririz. Korumalı alana alınmış bir sayfa yüklendiğinde benzersiz bir kaynağa taşınır ve reddedilir chrome.* API'lerine erişim. Korumalı alana alınmış bu sayfayı bir iframe aracılığıyla uzantımıza yüklersek veya bu iletiler üzerinde bir şekilde işlem yapmasına izin verebilir ve bunun bize geri bildirimlerinizi iletmesini bekleyebilir. yardımcı olur. Bu basit mesajlaşma mekanizması, eval odaklı bir yaklaşımı güvenli bir şekilde dahil etmemiz için ihtiyacımız olan her şeyi bize sağlıyor. kod eklememiz gerekiyor.

Korumalı alan oluşturma ve kullanma.

Doğrudan koda girmek istiyorsanız lütfen korumalı alan oluşturma örnek uzantısını alın ve kapalı'ya dokunun. Herkese açık kullanıcı adlarının üst kısmında oluşturulmuş küçük bir mesajlaşma API'sinin çalışan örneğidir. sadece şablon oluşturma kitaplığıdır ve başlamanız için gereken her şeyi sağlar. Belki tecrübeleri, örneğimize birlikte göz atalım.

Manifest'teki dosyaları listele

Korumalı alan içinde çalışması gereken her dosya, sandbox mülk. Bu önemli bir adımdır ve kolayca unutulabilir. Bu nedenle, korumalı alana alınan dosyanız manifestte listelenir. Bu örnekte, dosyayı akıllı bir şekilde korumalı alana alıyoruz. "sandbox.html" adını içerir. Manifest girişi aşağıdaki gibi görünür:

{
  ...,
  "sandbox": {
     "pages": ["sandbox.html"]
  },
  ...
}

Korumalı alana alınan dosyayı yükle

Korumalı alanlı dosyada ilginç bir şey yapmak için dosyayı uzantının kodu ile düzeltilebilir. Burada, sandbox.html uzantının Etkinlik Sayfası (eventpage.html) üzerinden iframe. eventpage.js kod içerir iframe ve contentWindow üzerinde postMessage yöntemini yürütüyoruz. Mesaj bir nesnedir Şu iki özellik içeren: context ve command. Birazdan her ikisine de değineceğiz.

chrome.browserAction.onClicked.addListener(function() {
 var iframe = document.getElementById('theFrame');
 var message = {
   command: 'render',
   context: {thing: 'world'}
 };
 iframe.contentWindow.postMessage(message, '*');
});
postMessage API hakkında genel bilgi için MDN ile ilgili postMessage dokümanlarına göz atın. Oldukça eksiksiz ve okumaya değer. Özellikle, verilerin yalnızca seri hale getirilebilmesi halinde karşılıklı aktarılabileceğini unutmayın. Örneğin, işlevler herhangi bir koşula tabi değildir.

Tehlikeli bir şey yap

sandbox.html yüklendiğinde Gider çubuğu kitaplığını yükler ve bir satır içi oluşturup derler Gidiş Çubuklarının önerdiği şekilde bir şablon oluşturun:

<script src="handlebars-1.0.0.beta.6.js"></script>
<script id="hello-world-template" type="text/x-handlebars-template">
  <div class="entry">
    <h1>Hello, !</h1>
  </div>
</script>
<script>
  var templates = [];
  var source = document.getElementById('hello-world-template').innerHTML;
  templates['hello'] = Handlebars.compile(source);
</script>

Bu işlem başarısız olmaz! Handlebars.compile, new Function işlevini kullansa da çalışır. tam olarak beklendiği gibi olduğunda templates['hello'] içinde derlenmiş bir şablon elde ederiz.

Sonucu geri verme

Komutları kabul eden bir mesaj dinleyici oluşturarak bu şablonu kullanıma sunacağız "etkinlik sayfasından". Yapılması gerekenleri belirlemek için iletilen command belgesini kullanırız ( yalnızca görüntüleme değil, şablonlar hazırlıyor mu? Belki bunları belirli bir şekilde?) ve context, oluşturma için doğrudan şablona aktarılır. Oluşturulan HTML etkinlik sayfasına geri gönderilir. Böylece, uzantı daha sonra faydalı bir işlem yapabilir:

<script>
  window.addEventListener('message', function(event) {
    var command = event.data.command;
    var name = event.data.name || 'hello';
    switch(command) {
      case 'render':
        event.source.postMessage({
          name: name,
          html: templates[name](event.data.context)
        }, event.origin);
        break;

      // case 'somethingElse':
      //   ...
    }
  });
</script>

Etkinlik sayfasına dönersek bu mesajı alıp html ile ilgi çekici bir şey yapacağız. iletilmiş olabilir. Bu durumda, Masaüstü Bildirimi üzerinden bunu tekrarlayacağız, ancak bu HTML, uzantının kullanıcı arayüzünün bir parçası olarak güvenli bir şekilde kullanılabilir. Ekleme yöntemi: innerHTML, korumalı alanın tamamen güvenliği ihlal edilse bile önemli bir güvenlik riski oluşturmaz bir kod, zararlı komut dosyası veya eklenti içeriği yerleştiremez ve daha ayrıntılı şekilde ele alacağız.

Bu mekanizma şablon oluşturmayı kolaylaştırır ancak elbette şablon oluşturma ile sınırlı değildir. Herhangi biri katı bir İçerik Güvenliği Politikası altında anında çalışmayan bir kod korumalı alana alınabilir; inç Aslında uzantılarınızın sırayla çalışacak bileşenlerini korumalı alana almak genellikle yararlıdır. ve programınızın her bir parçasını mümkün olan en küçük ayrıcalıklarla ve düzgün şekilde yürütülmesini sağlar. Google'dan Güvenli Web Uygulamaları ve Chrome Uzantıları Yazma sunumu I/O 2012, bu tekniklerin nasıl kullanıldığına dair iyi örnekler veriyor. 2012'de bu teknikle ilgili gerekir.