Uzaktan barındırılan kod ihlallerini giderme

Uzaktan barındırılan kod veya 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 şeyi çağırır. JavaScript ve WASM gibi. Verileri veya JSON ya da CSS gibi şeyleri içermez.

RHC'ye neden artık izin verilmiyor?

Manifest V3 uzantıları, artık kullandıkları tüm kodları uzantının kendi içinde paket hâline getirmelidir. Eskiden, komut dosyası etiketlerini web'deki herhangi bir URL'den dinamik olarak yerleştirebiliyordunuz.

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

Uzantınız inceleme sırasında Mavi Argon hatasıyla reddedilirse inceleme ekibimiz uzantınızın uzaktan barındırılan kod kullandığını düşünüyordur. Bu genellikle, bir uzantının uzak kaynağı olan bir komut dosyası etiketi eklemeye çalışması (ör. uzantıda yer alan dosyalar yerine açık web'den) veya doğrudan yürütülecek bir kaynağı getirmesi sonucunda ortaya çıkar.

RHC nasıl tespit edilir?

Neye bakacağınızı öğrendikten sonra RHC'yi tespit etmek özellikle zor değildir. Öncelikle projenizdeki "http://" veya "https://" dizelerini kontrol edin. Bir RHC ihlaliniz varsa, muhtemelen bunu bularak yerini bulabilirsiniz. Tam derleme sisteminiz varsa veya npm ya da diğer üçüncü taraf kaynaklardan bağımlılıklar kullanıyorsanız kodun derlenmiş sürümünü aradığınızdan emin olun. Çünkü kod bu sürümü aramaktadır. Sorunu hâlâ bulamıyorsanız bir sonraki adım One Stop Destek Ekibi ile iletişime geçmektir. Uzmanlar, belirli ihlalleri ve uzantının mümkün olan en kısa sürede yayınlanması için nelerin gerektiğini ana hatlarıyla açıklayabileceklerdir.

Bir kitaplık kod isterse yapılması gerekenler

Kod nereden gelirse gelsin RHC'de bulunmasına izin verilmez. Bu, sizin yazmadığınız ancak projenizde bir bağımlılık olarak kullandığınız kodu içerir. Firebase kullanan bazı geliştiriciler, Firebase Auth'a uzaktan kod dahil edilirken bu sorunu yaşıyordu. Bu, birinci taraf (yani Google'a ait) bir kitaplık olsa da, RHC için hiçbir istisna söz konusu değildir. Kodu, RHC'yi kaldıracak şekilde yapılandırmanız veya hedefinizi ilk olarak kodu dahil etmeyecek şekilde güncellemeniz gerekir. RHC'yi yükleyen sizin kodunuz değil, ancak kullandığınız bir kitaplıkla ilgili bir sorunla karşılaşırsanız, yapılacak en iyi işlem kitaplığın yazarıyla iletişime geçmektir. Böyle bir durumun olduğunu belirtin ve bunu kaldırmak için geçici bir çözüm veya kod güncellemeleri isteyin.

Kitaplık güncellemesini sabırsızlıkla bekliyorsanız ne yapmalıyım?

Bazı kitaplıklar, bilgilendirildikten hemen sonra güncellemeyi gönderir, ancak bazıları iptal edilebilir veya sorunun çözülmesi zaman alabilir. Söz konusu ihlalde ne olduğuna bağlı olarak, engellemenin kaldırılması ve başarılı bir incelemenin tamamlanması için kullanıcının taşınmasını beklemeniz gerekmeyebilir. Hızla çalışmaya başlamak için bir dizi seçenek vardır.

Kodu denetleyin

Bu isteğe neden olan kodun gerekli olduğundan emin misiniz? Kod sadece silinebiliyorsa veya ona neden olan bir kitaplık kaldırılabiliyorsa ilgili kodu silin. İşiniz tamamlanır.

Alternatif olarak aynı özellikleri sunan başka bir kitaplık var mı? Aynı kullanım alanlarına uygun diğer seçenekler için npmjs.com, GitHub veya başka sitelere göz atmayı deneyin.

Ağaç sallama

RHC ihlaline neden olan kod gerçekten kullanılmıyorsa araçlar kullanılarak otomatik olarak silinebilir. Webpack, Rollup ve Vite gibi modern derleme araçları, ağaç sallama adlı bir özelliğe sahiptir. Derleme sisteminizde etkinleştirildikten sonra ağaç sallama, kullanılmayan tüm kod yollarını kaldıracaktır. Bu, kodunuzun yalnızca daha uyumlu bir sürümüne değil, daha yalın ve daha hızlı bir sürümüne de sahip olduğunuz anlamına gelebilir! Tüm kitaplıklar ağaç sallantısının mümkün olmadığını ancak birçok kitaplığın sallanabileceğini unutmamak gerekir. Toplayıcı ve Vite gibi bazı araçlarda ağaç sallama özelliği varsayılan olarak etkindir. Bu özelliğin etkinleştirilmesi için web paketinin yapılandırılması gerekir. Uzantınızın bir parçası olarak bir derleme sistemi kullanmıyor ancak kod kitaplıklarını kullanıyorsanız iş akışınıza bir derleme aracı eklemeyi araştırmanızı kesinlikle öneririz. Derleme araçları daha güvenli, güvenilir ve sürdürülebilir projeler yazmanıza yardımcı olur.

Ağaç sıkışmalarının nasıl uygulanacağı, projenize bağlıdır. Ancak Rollup ile ilgili basit bir örnek verecek olursak, proje kodunuzu derleyerek ağaç sıkışma yöntemi ekleyebilirsiniz. Örneğin, yalnızca Firebase Auth'a giriş yapan main.js adlı bir dosyanız varsa:

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

chrome.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 tek yapmanız gereken Rollup'a giriş dosyasını, @rollup/plugin-node-resolve düğüm dosyalarını yüklemek için gereken eklentiyi ve oluşturduğu çıkış dosyasının adını bildirmektir.

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ş ve tamamı compiled.js adlı tek bir dosyada derlenmiş bir sürümünü alırsınız.

Birleştirme basit bir işlem olabilir, ancak aynı zamanda çok yapılandırılabilir. Her türden karmaşık mantık ve yapılandırma ekleyebilirsiniz, bunların belgelerine göz atabilirsiniz. Bunun gibi derleme araçları eklemek daha küçük ve daha verimli bir kodla sonuçlanır ve bu durumda, uzaktan barındırılan kod sorunumuzu düzeltir.

Dosyaları otomatik olarak düzenleme

Dahil ettiğiniz bir kitaplığın bağımlılığı, uzaktan barındırılan kodun kod tabanınıza girebilmesini sağlamak için gitgide yaygınlaşan bir yöntemdir. X kitaplığı bir CDN'den import kitaplığı oluşturmak isterse Y öğesini yine de yerel bir kaynaktan yüklemek için güncellemeniz gerekir. Modern derleme sistemleriyle, uzak referansları çıkarmak için gerçekten de eklentiler oluşturabilir ve bunu doğrudan kodunuza satır içine alabilirsiniz.

Bu, ilgili kodun aşağıdaki gibi göründüğü anlamına gelir:

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

Küçük bir kapsamlı görünüm 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
    }
  }]
};

Derlemeyi yeni eklentiyle çalıştırdığınızda, her uzak import URL'si keşfedilir. URL'nin kodumuz, alt bağımlılık veya alt bağımlılık ya da başka bir yer olup olmadığına bakılmaz.

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. İstediğiniz metin düzenleyicide açın ve ihlale neden olan satırları silin. Bu, kırılgan olduğundan ve unutulabileceğinden genellikle tavsiye edilmez. "library.min.js" adlı dosya aslında library.min.js olmadığında projenizi yönetmeyi zorlaştırır. Ham dosyaları düzenlemek yerine biraz daha sürdürülebilir bir seçenek, patch-package gibi bir araç kullanmaktır. Bu, değişiklikleri dosyanın kendisi yerine dosyaya kaydetmenize olanak tanıyan son derece güçlü bir seçenektir. Git veya Subversion gibi sürüm kontrol sistemlerinde olduğu gibi, yama dosyaları üzerine kurulmuştur. İhlale neden olan kodu manuel olarak değiştirmeniz, fark dosyasını kaydetmeniz ve yama paketini uygulamak istediğiniz değişikliklerle yapılandırmanız yeterlidir. Eğiticinin tamamını projenin benioku bölümünde okuyabilirsiniz. Bir projeye yama uyguluyorsanız, gerçekten projeyle iletişime geçerek değişikliklerin yapılmasını talep etmenizi öneririz. Yama paketi, yamaların yönetilmesini çok daha kolay hale getirse de yama yapacak hiçbir şeyin olmaması daha da iyidir.

Kod kullanılmıyorsa ne yapmak gerekir?

Kod tabanları büyüdükçe, artık kullanılmayan kod yolları bu bağımlılıklar (veya bir bağımlılığın veya ... öğesinin bağımlılığı) barındırabilir. Bu bölümlerden birinde RHC'yi yüklemek veya yürütmek için kod bulunuyorsa bu kodun kaldırılması gerekir. Ölü veya kullanılmamış olması önemli değildir. Kullanılmıyorsa ağaç sallanarak veya kitaplığın kaldırılması için yama uygulanarak kaldırılması gerekir.

Geçici bir çözüm var mı?

Genel olarak hayır. RHC'ye izin verilmez. Bununla birlikte, buna izin verildiği az sayıda durum vardır. Neredeyse her zaman başka bir seçeneği kullanmak imkansız hale gelir.

Kullanıcı Komut Dosyaları API'sı

Kullanıcı Komut Dosyaları, genellikle kullanıcı tarafından sağlanan ve TamperMonkey ve Violentmonkey gibi Kullanıcı Komut Dosyası yöneticileri için tasarlanmış 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, chrome.scripting.executeScript veya diğer kod yürütme ortamlarının yerine geçmez. Kullanıcıların herhangi bir işlemi yürütmesi için geliştirici modunu etkinleştirmesi gerekir. Chrome Web Mağazası inceleme ekibi, bu özelliğin kullanım amacı dışında bir şekilde kullanıldığını (ör. kullanıcı tarafından sağlanan kod) tespit ederse uygulama reddedilebilir veya mağaza girişinden kaldırılabilir.

chrome.debugger

chrome.debugger API, uzantılara Chrome Geliştirici Araçları Protokolü ile etkileşime geçme imkanı sunar. Bu, Chrome'un Geliştirici Araçları'nda kullanılan protokolle ve inanılmaz sayıda diğer araç için kullanılır. Bu ağ ile bir uzantı uzak kod isteyip yürütebilir. Kullanıcı komut dosyalarında olduğu gibi, chrome.scripting'in yerine geçmez ve çok daha dikkate değer bir kullanıcı deneyimi sunar. Kullanıldığı sırada kullanıcıya pencerenin üst kısmında bir uyarı çubuğu gösterilir. Banner kapatılırsa veya hata ayıklama oturumu sonlandırılır.

Chrome'daki adres çubuğunda "Hata Ayıklayıcı Uzantısı bu tarayıcıda hata ayıklamaya başladı" mesajının bulunduğu ekran görüntüsü
Chrome'daki adres çubuğunda "Hata Ayıklayıcı Uzantısı bu tarayıcıda hata ayıklamaya başladı" mesajının göründüğü ekran görüntüsü

Korumalı alana alınmış iframe'ler

Bir dizeyi kod olarak değerlendirmeniz gerekiyorsa ve bir DOM ortamında (ör. uzantı hizmet çalışanı yerine bir içerik komut dosyası) içindeyseniz diğer bir seçenek de korumalı alana alınmış iframe kullanmaktır. Uzantılar, güvenlik önlemi olarak eval() gibi özellikleri varsayılan olarak desteklemez. Zararlı kodlar kullanıcıların güvenliğini tehlikeye atabilir. Ancak kod yalnızca bilinen güvenli bir ortamda (web'in geri kalanından korumalı alana alınan bir iframe gibi) çalıştırıldığında bu riskler büyük ölçüde azalır. Bu bağlamda, değerlendirmenin kullanılmasını engelleyen İçerik Güvenliği Politikası kaldırılabilir ve böylece tüm geçerli JavaScript kodlarını çalıştırabilirsiniz.

Kapsamda olmayan bir kullanım alanınız varsa geri bildirim almak için chromium-extensions posta listesini kullanarak ekiple iletişime geçebilir veya yeni bir destek kaydı açarak One Stop Support'tan yardım isteyebilirsiniz.

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

Politikaların uygulanması incelikli olabilir ve inceleme manuel giriş gerektirir. Bu da Chrome Web Mağazası ekibinin bazen bir inceleme kararını değiştirmeyi kabul edebileceği anlamına gelir. İncelemede hata yapıldığını düşünüyorsanız Tek Noktadan Destek'i kullanarak reddetme işlemine itiraz edebilirsiniz.