Menangani pelanggaran kode yang dihosting dari jarak jauh

Kode yang dihosting dari jarak jauh, atau RHC, adalah sebutan Chrome Web Store untuk semua hal yang dieksekusi oleh browser yang dimuat dari tempat selain dari file ekstensi itu sendiri. Hal-hal seperti JavaScript dan WASM. Tidak menyertakan data atau hal-hal seperti JSON atau CSS.

Mengapa RHC tidak lagi diizinkan?

Dengan Manifes V3, ekstensi kini perlu menggabungkan semua kode yang mereka gunakan di dalam ekstensi itu sendiri. Sebelumnya, Anda dapat menyisipkan tag skrip secara dinamis dari URL mana pun di web.

Saya diberi tahu bahwa ekstensi saya memiliki RHC. Apa yang terjadi?

Jika ekstensi Anda ditolak selama peninjauan dengan error Blue Argon, maka peninjau kami yakin bahwa ekstensi Anda menggunakan kode yang dihosting dari jarak jauh. Hal ini biasanya merupakan akibat dari ekstensi yang mencoba menambahkan tag skrip dengan resource jarak jauh (yaitu dari web terbuka, bukan file yang disertakan dalam ekstensi), atau mengambil resource untuk dieksekusi secara langsung.

Cara mendeteksi RHC

Mendeteksi RHC tidak terlalu sulit setelah Anda tahu apa yang harus dicari. Pertama, periksa string "http://" atau "https://" di project Anda. Jika Anda melakukan pelanggaran RHC, Anda mungkin dapat menemukannya dengan mencari pelanggaran tersebut. Jika Anda memiliki sistem build lengkap, atau menggunakan dependensi dari npm atau sumber pihak ketiga lainnya, pastikan Anda menelusuri kode versi yang dikompilasi, karena itulah yang dievaluasi oleh Play Store. Jika Anda masih tidak dapat menemukan masalahnya, langkah berikutnya adalah menghubungi One Stop Support. Mereka akan dapat menguraikan pelanggaran tertentu, dan apa yang diperlukan agar ekstensi dipublikasikan sesegera mungkin.

Yang harus dilakukan jika pustaka meminta kode

Terlepas dari asal kode, kode tersebut tidak diizinkan memiliki RHC. Hal ini mencakup kode yang tidak Anda tulis, tetapi kebetulan digunakan sebagai dependensi dalam project Anda. Beberapa developer yang menggunakan Firebase mengalami masalah ini saat kode jarak jauh disertakan untuk digunakan di Firebase Auth. Meskipun ini adalah library pihak pertama (yaitu milik Google), tidak ada pengecualian yang diberikan untuk RHC. Anda perlu mengonfigurasi kode untuk menghapus RHC atau memperbarui project agar tidak menyertakan kode sejak awal. Jika Anda mengalami masalah saat bukan kode Anda yang memuat RHC, tetapi library yang Anda gunakan, maka tindakan terbaik adalah menghubungi penulis library. Beri tahu mereka bahwa hal ini terjadi, dan minta solusi atau update kode untuk menghapusnya.

Bagaimana jika Anda tidak dapat menunggu update library

Beberapa library akan mengirimkan update hampir segera setelah diberi tahu, tetapi yang lain mungkin diabaikan atau memerlukan waktu untuk mengatasi masalah. Bergantung pada apa yang terjadi dalam pelanggaran tertentu, Anda mungkin tidak perlu menunggu hingga pelanggaran tersebut berpindah status menjadi tidak diblokir dan menyelesaikan peninjauan yang berhasil. Ada sejumlah opsi yang tersedia untuk kembali beroperasi dengan cepat.

Mengaudit kode

Apakah Anda yakin bahwa kode yang menyebabkan permintaan tersebut diperlukan? Jika kode tersebut dapat dihapus saja, atau library yang menyebabkannya dapat dihapus, maka hapus kode tersebut, dan tugas selesai.

Atau, apakah ada library lain yang menawarkan fitur yang sama? Coba periksa npmjs.com, GitHub, atau situs lain untuk opsi lain yang memenuhi kasus penggunaan yang sama.

Tree shaking

Jika kode yang menyebabkan pelanggaran RHC sebenarnya tidak digunakan, kode tersebut mungkin dapat dihapus secara otomatis oleh alat. Alat build modern seperti webpack, Rollup, dan Vite (hanya beberapa di antaranya) memiliki fitur yang disebut tree-shaking. Setelah diaktifkan di sistem build, penghapusan kode yang tidak digunakan akan menghapus jalur kode yang tidak digunakan. Artinya, Anda tidak hanya memiliki versi kode yang lebih patuh, tetapi juga lebih ramping dan lebih cepat. Penting untuk diperhatikan bahwa tidak semua library dapat di-tree shake, tetapi banyak yang bisa. Beberapa alat, seperti Rollup dan Vite, mengaktifkan penghapusan kode yang tidak terpakai secara default. webpack perlu dikonfigurasi agar dapat diaktifkan. Jika Anda tidak menggunakan sistem build sebagai bagian dari ekstensi, tetapi menggunakan library kode, sebaiknya Anda menyelidiki cara menambahkan alat build ke alur kerja Anda. Alat Build membantu Anda menulis project yang lebih aman, andal, dan mudah dikelola.

Detail spesifik tentang cara menerapkan penghapusan kode yang tidak terpakai bergantung pada project spesifik Anda. Namun, untuk mengambil contoh sederhana dengan Rollup, Anda dapat menambahkan penghilangan kode yang tidak terpakai hanya dengan mengompilasi kode project Anda. Misalnya, jika Anda memiliki file yang hanya login ke Firebase Auth, yang disebut 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);
  }
});

Kemudian, Anda hanya perlu memberi tahu Rollup file input, plugin yang diperlukan untuk memuat file node @rollup/plugin-node-resolve, dan nama file output yang dibuatnya.

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

Dengan menjalankan perintah tersebut di jendela terminal, Anda akan menerima versi yang dibuat dari file main.js kami, yang semuanya dikompilasi menjadi satu file bernama compiled.js.

Rollup bisa sederhana, tetapi juga sangat dapat dikonfigurasi. Anda dapat menambahkan semua jenis logika dan konfigurasi yang kompleks, cukup lihat dokumentasinya. Menambahkan alat build seperti ini akan menghasilkan kode yang lebih kecil dan efisien, dan dalam kasus ini, memperbaiki masalah kode yang dihosting dari jarak jauh.

Mengedit file secara otomatis

Cara yang semakin umum agar kode yang dihosting dari jarak jauh dapat masuk ke codebase Anda adalah sebagai subdependensi library yang Anda sertakan. Jika library X ingin memuat library import dari CDN Y, Anda tetap perlu memperbaruinya agar dapat dimuat dari sumber lokal. Dengan sistem build modern, Anda dapat dengan mudah membuat plugin untuk mengekstrak referensi jarak jauh, dan menyisipkannya langsung ke dalam kode Anda.

Artinya, kode yang diberikan akan terlihat seperti ini:

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

Anda dapat membuat plugin rollup kecil.

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
    }
  }]
};

Setelah Anda menjalankan build dengan plugin baru, setiap URL import jarak jauh akan ditemukan, terlepas dari apakah itu kode kami, subdependensi, subsubdependensi, atau di tempat lain.

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

Mengedit file secara manual

Opsi paling sederhana adalah menghapus kode yang menyebabkan RHC. Buka di editor teks pilihan Anda, lalu hapus baris yang melanggar. Hal ini umumnya tidak disarankan, karena rapuh dan dapat dilupakan. Hal ini akan mempersulit pemeliharaan project Anda jika file bernama "library.min.js" sebenarnya bukan library.min.js. Daripada mengedit file mentah, opsi yang sedikit lebih mudah dikelola adalah menggunakan alat seperti patch-package. Ini adalah opsi yang sangat canggih yang memungkinkan Anda menyimpan modifikasi ke file, bukan file itu sendiri. Fitur ini dibangun di atas file patch, jenis yang sama dengan yang mendukung sistem kontrol versi seperti Git atau Subversion. Anda hanya perlu mengubah kode yang melanggar secara manual, menyimpan file diff, dan mengonfigurasi patch-package dengan perubahan yang ingin Anda terapkan. Anda dapat membaca tutorial lengkap di readme project. Jika Anda melakukan patching pada project, kami sangat mendorong Anda untuk menghubungi project tersebut guna meminta agar perubahan dilakukan di upstream. Meskipun patch-package membuat pengelolaan patch jauh lebih mudah, tidak ada yang perlu di-patch akan lebih baik.

Yang harus dilakukan jika kode tidak digunakan

Seiring berkembangnya codebase, dependensi (atau dependensi dari dependensi, atau dependensi dari…) dapat mempertahankan jalur kode yang tidak lagi digunakan. Jika salah satu bagian tersebut menyertakan kode untuk memuat atau mengeksekusi RHC, kode tersebut harus dihapus. Tidak masalah apakah baterai habis atau tidak digunakan. Jika tidak digunakan, library harus dihapus, baik dengan penghapusan kode yang tidak digunakan, atau dengan melakukan patch pada library untuk menghapusnya.

Apakah ada solusi lain?

Secara umum, tidak. RHC tidak diizinkan. Namun, ada sejumlah kecil kasus yang mengizinkannya. Hal ini hampir selalu terjadi jika opsi lain tidak memungkinkan.

User Scripts API

Skrip Pengguna adalah cuplikan kode kecil yang biasanya disediakan oleh pengguna, yang ditujukan untuk pengelola Skrip Pengguna seperti TamperMonkey dan Violentmonkey. Pengelola ini tidak dapat menggabungkan kode yang ditulis oleh pengguna, sehingga User Script API mengekspos cara untuk mengeksekusi kode yang diberikan oleh pengguna. Hal ini bukan pengganti browser.scripting.executeScript, atau lingkungan eksekusi kode lainnya. Pengguna harus mengaktifkan mode developer untuk menjalankan apa pun. Jika tim peninjau Chrome Web Store menganggap bahwa fitur ini digunakan dengan cara yang tidak sesuai dengan tujuannya (yaitu kode yang diberikan oleh pengguna), fitur ini dapat ditolak atau listingannya dihapus dari Chrome Web Store.

browser.debugger

browser.debugger API memberi ekstensi kemampuan untuk berinteraksi dengan Chrome Devtools Protocol. Ini adalah protokol yang sama yang digunakan untuk Devtools Chrome, dan sejumlah alat lainnya yang luar biasa. Dengan demikian, ekstensi dapat meminta dan mengeksekusi kode jarak jauh. Sama seperti skrip pengguna, fitur ini bukan pengganti browser.scripting, dan memiliki pengalaman pengguna yang jauh lebih baik. Saat digunakan, pengguna akan melihat kolom peringatan di bagian atas jendela. Jika banner ditutup atau diabaikan, sesi penelusuran bug akan dihentikan.

Screenshot kolom URL di Chrome yang menampilkan pesan 'Debugger Extension started debugging this browser' (Ekstensi Debugger mulai men-debug browser ini)
Screenshot kolom URL di Chrome yang berisi pesan 'Debugger Extension started debugging this browser'

Iframe dengan sandbox

Jika Anda perlu mengevaluasi string sebagai kode, dan berada di lingkungan DOM (misalnya, skrip konten, bukan service worker ekstensi), maka opsi lain adalah menggunakan iframe sandbox. Ekstensi tidak mendukung hal-hal seperti eval() secara default sebagai tindakan pencegahan keamanan. Kode berbahaya dapat membahayakan keselamatan dan keamanan pengguna. Namun, jika kode hanya dieksekusi di lingkungan yang aman dan tepercaya, seperti iframe yang telah di-sandbox dari web lainnya, risiko tersebut akan sangat berkurang. Dalam konteks ini, Kebijakan Keamanan Konten yang memblokir penggunaan eval dapat diangkat, sehingga Anda dapat menjalankan kode JavaScript yang valid.

Jika Anda memiliki kasus penggunaan yang tidak tercakup, jangan ragu untuk menghubungi tim menggunakan milis chromium-extensions untuk mendapatkan masukan, atau buka tiket baru untuk meminta panduan dari One Stop Support

Yang harus dilakukan jika Anda tidak setuju dengan putusan

Penegakan kebijakan dapat bersifat rumit dan peninjauan melibatkan input manual, yang berarti tim Chrome Web Store terkadang setuju untuk mengubah keputusan peninjauan. Jika Anda yakin bahwa kesalahan terjadi dalam peninjauan, Anda dapat mengajukan banding atas penolakan tersebut menggunakan Dukungan Terpadu