Uzaktan barındırılan kod ihlallerini giderme

Uzakta barındırılan kod (RHC), Chrome Web Mağazası'nın, uzantının kendi dosyaları dışında bir yerden yüklenen ve tarayıcı tarafından yürütülen her şeye verdiği addır. JavaScript ve WASM gibi öğeler. JSON veya CSS gibi veriler ya da öğeler dahil değildir.

Neden artık RHC'ye izin verilmiyor?

Manifest V3 ile birlikte uzantıların, kullandıkları tüm kodu uzantının içine paketlemesi gerekiyor. Geçmişte, web'deki herhangi bir URL'den komut dosyası etiketlerini dinamik olarak ekleyebiliyordunuz.

Uzantımın RHC'ye sahip olduğu söylendi. Neler oluyor?

Uzantınız inceleme sırasında Blue Argon hatasıyla reddedildiyse inceleme ekibimiz, uzantınızın uzaktan barındırılan kod kullandığını düşünüyor. Bu durum genellikle bir uzantının uzak bir kaynakla (yani uzantıya dahil edilen dosyalar yerine açık web'den) bir komut dosyası etiketi eklemeye çalışmasından veya doğrudan yürütülecek bir kaynağı getirmesinden kaynaklanır.

RHC'yi nasıl tespit edebilirsiniz?

Ne arayacağınızı bildiğinizde RHC'yi tespit etmek zor değildir. Öncelikle projenizde "http://" veya "https://" dizelerini arayın. RHC ihlaliniz varsa bu ihlali bularak ilgili yorumları da bulabilirsiniz. Tam bir derleme sisteminiz varsa veya npm ya da diğer üçüncü taraf kaynaklarından bağımlılıklar kullanıyorsanız mağaza tarafından değerlendirilen kodun derlenmiş sürümünü aradığınızdan emin olun. Sorunu hâlâ bulamıyorsanız bir sonraki adım One Stop Support ile iletişime geçmektir. Bu kişiler, ihlalleri ve uzantının en kısa sürede yayınlanması için gerekenleri belirleyebilir.

Bir kitaplık kodu istiyorsa ne yapmalısınız?

Kodun kaynağı ne olursa olsun RHC'ye izin verilmez. Bu, sizin yazmadığınız ancak projenizde bağımlılık olarak kullandığınız kodları da içerir. Firebase kullanan bazı geliştiriciler, Firebase Auth'ta kullanılmak üzere uzaktan kod eklendiğinde bu sorunla karşılaştı. Bu, birinci taraf (yani Google'a ait) bir kitaplık olsa da RHC için istisna yapılmaz. Kodu, RHC'yi kaldıracak veya projenizi güncelleyerek kodu en başından itibaren içermeyecek şekilde yapılandırmanız gerekir. RHC'yi yükleyen sizin kodunuz değil de kullandığınız bir kitaplık olduğunda en iyi çözüm, kitaplığın yazarıyla iletişime geçmektir. Bu durumdan haberdar olmalarını sağlayın ve geçici bir çözüm veya kodu kaldıracak güncellemeler isteyin.

Kitaplık güncellemesini bekleyemiyorsanız ne yapmalısınız?

Bazı kitaplıklar, bildirildikten hemen sonra güncellemeyi gönderir. Ancak diğerleri terk edilmiş olabilir veya sorunu çözmek zaman alabilir. İhlalin ne olduğuna bağlı olarak, engellemenin kaldırılması ve incelemenin başarıyla tamamlanması için bu ihlallerin taşınmasını beklemeniz gerekmeyebilir. Hızlı bir şekilde tekrar çalışmaya başlamak için çeşitli seçenekler mevcuttur.

Kodu denetleme

İsteğe neden olan kodun gerekli olduğundan emin misiniz? Yalnızca silinebiliyorsa veya buna neden olan bir kitaplık kaldırılabiliyorsa kodu silmeniz yeterlidir.

Alternatif olarak, aynı özellikleri sunan başka bir kitaplık var mı? Aynı kullanım alanlarını karşılayan diğer seçenekler için npmjs.com, GitHub veya diğer siteleri kontrol edin.

Ağaç sallama

RHC ihlaline neden olan kod aslında kullanılmıyorsa araçlar tarafından otomatik olarak silinebilir. webpack, Rollup ve Vite gibi modern derleme araçlarında (sadece birkaç örnek) tree-shaking adı verilen bir özellik bulunur. Derleme sisteminizde etkinleştirildikten sonra tree shaking, kullanılmayan tüm kod yollarını kaldırmalıdır. Bu, kodunuzun yalnızca daha uyumlu bir sürümüne değil, aynı zamanda daha yalın ve hızlı bir sürümüne sahip olabileceğiniz anlamına gelir. Tüm kitaplıkların ağaç sallama işlemine tabi tutulamadığını ancak çoğunun tutulabildiğini unutmayın. Rollup ve Vite gibi bazı araçlarda tree-shaking özelliği varsayılan olarak etkindir. webpack'te bu özelliğin etkinleştirilmesi için yapılandırılması gerekir. Uzantınızın bir parçası olarak derleme sistemi kullanmıyorsanız ancak kod kitaplıkları kullanıyorsanız iş akışınıza bir derleme aracı eklemeyi araştırmanız önemle tavsiye edilir. Derleme araçları, daha güvenli, daha güvenilir ve daha sürdürülebilir projeler yazmanıza yardımcı olur.

Ağaç sallama işleminin nasıl uygulanacağı, projenize bağlıdır. Ancak Rollup ile basit bir örnek vermek gerekirse proje kodunuzu derleyerek ağaç sallama özelliğini ekleyebilirsiniz. Örneğin, yalnızca Firebase Auth'a giriş yapan bir dosyanız varsa (ör. main.js):

import { GoogleAuthProvider, initializeAuth } from "firebase/auth";

browser.identity.getAuthToken({ 'interactive': true }, async (token) => {
  const credential = GoogleAuthProvider.credential(null, token);
  try {
    const app = initializeApp({ ... });
    const auth = initializeAuth(app, { popupRedirectResolver: undefined, persistence: indexDBLocalPersistence });
    const { user } = await auth.signInWithCredential(credential)
    console.log(user)
  } catch (e) {
    console.error(error);
  }
});

Ardından, Rollup'a giriş dosyasını, düğüm dosyalarını yüklemek için gereken bir eklentiyi (@rollup/plugin-node-resolve) ve oluşturduğu çıkış dosyasının adını söylemeniz yeterlidir.

npx rollup --input main.js --plugin '@rollup/plugin-node-resolve' --file compiled.js

Bu komutu bir terminal penceresinde çalıştırdığınızda, main.js dosyamızın oluşturulmuş bir sürümünü alırsınız. Bu sürüm, compiled.js adlı tek bir dosyada derlenir.

Toplama işlemi basit olabilir ancak çok fazla yapılandırılabilir. Her türlü karmaşık mantık ve yapılandırmayı ekleyebilirsiniz. Bunun için dokümanlarına göz atmanız yeterlidir. Bu tür bir derleme aracı eklemek daha küçük ve daha verimli bir kodla sonuçlanır. Bu durumda, uzaktan barındırılan kod sorunumuz düzeltilir.

Dosyaları otomatik olarak düzenleme

Uzakta barındırılan kodun kod tabanınıza girmesinin giderek daha yaygın bir yolu, dahil ettiğiniz bir kitaplığın alt bağımlılığı olarak gerçekleşir. Kitaplık X, CDN'den kitaplık Y'yi import etmek istiyorsa yerel bir kaynaktan yüklenmesi için yine de güncellemeniz gerekir. Modern derleme sistemleriyle, uzaktan referans ayıklamak ve doğrudan kodunuza yerleştirmek için kolayca eklentiler oluşturabilirsiniz.

Bu durumda, aşağıdaki gibi görünen bir kod verildiğinde:

import moment from "https://unpkg.com/moment@2.29.4/moment.js"
console.log(moment())

Küçük bir Rollup eklentisi oluşturabilirsiniz.

import { existsSync } from 'fs';
import fetch from 'node-fetch';

export default {
  plugins: [{
    load: async function transform(id, options, outputOptions) {
      // this code runs over all of out javascript, so we check every import
      // to see if it resolves as a local file, if that fails, we grab it from
      // the network using fetch, and return the contents of that file directly inline
      if (!existsSync(id)) {
        const response = await fetch(id);
        const code = await response.text();

        return code
      }
      return null
    }
  }]
};

Yeni eklentiyle derlemeyi çalıştırdıktan sonra, kodumuz, bir alt bağımlılık, alt alt bağımlılık veya başka bir yerde olup olmadığına bakılmaksızın her uzak import URL keşfedilir.

npx rollup --input main.js --config ./rollup.config.mjs --file compiled.js

Dosyaları manuel olarak düzenleme

En basit seçenek, RHC'ye neden olan kodu silmektir. Tercih ettiğiniz metin düzenleyicide açın ve ihlalde bulunan satırları silin. Bu genellikle pek tavsiye edilmez. Çünkü bu yöntem kırılgan bir yapıya sahiptir ve unutulabilir. "library.min.js" adlı bir dosya gerçekte library.min.js olmadığında projenizi sürdürmek zorlaşır. Ham dosyaları düzenlemek yerine, patch-package gibi bir araç kullanmak biraz daha sürdürülebilir bir seçenektir. Bu seçenek, dosyayı değil, dosyadaki değişiklikleri kaydetmenizi sağlayan son derece güçlü bir seçenektir. Yama dosyaları üzerine kurulmuştur. Bu dosyalar, Git veya Subversion gibi sürüm kontrol sistemlerine güç veren dosyalarla aynı türdendir. İhlal eden kodu manuel olarak değiştirmeniz, diff dosyasını kaydetmeniz ve patch-package'ı uygulamak istediğiniz değişikliklerle yapılandırmanız yeterlidir. Projenin readme dosyasında tam bir eğitim okuyabilirsiniz. Bir projeyi yamalıyorsanız değişikliklerin yukarı akışta yapılmasını istemek için projeyle iletişime geçmenizi gerçekten öneririz. patch-package, yamaları yönetmeyi çok daha kolay hale getirse de yamanacak hiçbir şeyin olmaması daha da iyidir.

Kod kullanılmıyorsa ne yapmalısınız?

Kod tabanları büyüdükçe bağımlılıklar (veya bir bağımlılığın bağımlılığı ya da bağımlılıklar) artık kullanılmayan kod yollarını tutabilir. Bu bölümlerden birinde RHC'yi yükleme veya yürütme kodu varsa bu kodun kaldırılması gerekir. Ölü veya kullanılmayan cihazlar da dahil olmak üzere tüm cihazlar için geçerlidir. Kullanılmıyorsa ağaç sallama veya kitaplığı yamalayarak kaldırılmalıdır.

Herhangi bir geçici çözüm var mı?

Genel olarak hayır. RHC'ye izin verilmez. Ancak, bu özelliğin kullanılabildiği az sayıda durum vardır. Bu durumlar, neredeyse her zaman başka bir seçeneğin mümkün olmadığı durumlardır.

User Scripts API

Kullanıcı komut dosyaları, genellikle kullanıcı tarafından sağlanan ve TamperMonkey ve Violentmonkey gibi kullanıcı komut dosyası yöneticileri için tasarlanan küçük kod snippet'leridir. Bu yöneticilerin, kullanıcılar tarafından yazılan kodu paketlemesi mümkün değildir. Bu nedenle, User Script API, kullanıcı tarafından sağlanan kodu yürütmenin bir yolunu sunar. Bu, browser.scripting.executeScript veya diğer kod yürütme ortamlarının yerine kullanılamaz. Kullanıcıların herhangi bir işlemi yürütmek için geliştirici modunu etkinleştirmesi gerekir. Chrome Web Mağazası inceleme ekibi, bunun amaçlanandan farklı bir şekilde (ör. kullanıcı tarafından sağlanan kod) kullanıldığını düşünürse uzantı reddedilebilir veya mağazadaki listelemesi kaldırılabilir.

browser.debugger

browser.debugger API'si, uzantılara Chrome Geliştirici Araçları Protokolü ile etkileşim kurma olanağı tanır. Bu, Chrome'un geliştirici araçları ve diğer birçok araç için kullanılan protokoldür. Bu sayede bir uzantı, uzaktan kod isteğinde bulunabilir ve kodu çalıştırabilir. Kullanıcı komut dosyaları gibi, tarayıcı komut dosyası oluşturma özelliğinin yerine geçmez ve çok daha dikkat çekici bir kullanıcı deneyimi sunar. Kullanım sırasında pencerenin üst kısmında bir uyarı çubuğu gösterilir. Banner kapatılırsa veya kapatma düğmesi tıklanırsa hata ayıklama oturumu sonlandırılır.

Chrome'daki adres çubuğunun "Hata ayıklayıcı uzantısı bu tarayıcıda hata ayıklamaya başladı" mesajını içeren ekran görüntüsü
Chrome'daki adres çubuğunun "Debugger Extension started debugging this browser" (Hata Ayıklayıcı Uzantısı bu tarayıcıda hata ayıklamaya başladı) mesajını içeren ekran görüntüsü

Korumalı alana alınmış iframe'ler

Bir dizeyi kod olarak değerlendirmeniz gerekiyorsa ve DOM ortamındaysanız (ör. uzantı hizmeti çalışanı yerine içerik komut dosyası) korumalı alan iFrame kullanabilirsiniz. Uzantılar, güvenlik önlemi olarak varsayılan durumda eval() gibi öğeleri desteklemez. Kötü amaçlı kod, kullanıcıların güvenliğini ve emniyetini riske atabilir. Ancak kod yalnızca bilinen güvenli bir ortamda (ör. web'in geri kalanından korumalı alan oluşturulmuş bir iFrame) yürütüldüğünde bu riskler büyük ölçüde azalır. Bu bağlamda, eval kullanımını engelleyen İçerik Güvenliği Politikası kaldırılabilir ve geçerli JavaScript kodlarını çalıştırmanıza olanak tanınır.

Kapsam dışı bir kullanım alanınız varsa geri bildirim almak için chromium-extensions posta listesini kullanarak ekibe ulaşabilir veya One Stop Support'tan rehberlik istemek için yeni bir destek kaydı açabilirsiniz.

Bir karara katılmıyorsanız ne yapmalısınız?

Politikaların uygulanması ayrıntılı bir süreçtir ve inceleme için manuel giriş gerekir. Bu nedenle, Chrome Web Mağazası ekibi bazen bir inceleme kararını değiştirmeyi kabul edebilir. İnceleme sırasında bir hata yapıldığını düşünüyorsanız One Stop Support'u kullanarak reddedilmeye itiraz edebilirsiniz.