Menangani pelanggaran kode yang dihosting dari jarak jauh

Kode yang dihosting dari jarak jauh, atau RHC, adalah apa yang dipanggil Chrome Web Store terhadap apa pun yang dijalankan oleh browser yang dimuat dari suatu tempat selain file ekstensi itu sendiri. Hal-hal seperti JavaScript dan WASM. Metrik ini tidak menyertakan data atau hal-hal seperti JSON atau CSS.

Mengapa RHC tidak lagi diizinkan?

Dengan ekstensi Manifes V3, kini harus memaketkan semua kode yang digunakan di dalam ekstensi itu sendiri. Sebelumnya, Anda dapat memasukkan 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, peninjau kami yakin bahwa ekstensi Anda menggunakan kode yang dihosting dari jarak jauh. Masalah ini biasanya disebabkan oleh ekstensi yang mencoba menambahkan tag skrip dengan resource jarak jauh (yaitu dari web yang terbuka, bukan dari file yang disertakan dalam ekstensi), atau pengambilan resource untuk dijalankan secara langsung.

Cara menemukan RHC

Menemukan RHC tidak terlalu sulit setelah Anda tahu apa yang harus dicari. Pertama, periksa string "http://" atau "https://" dalam project Anda. Jika Anda memiliki pelanggaran RHC, Anda mungkin dapat menemukannya dengan menemukannya. Jika Anda memiliki sistem build lengkap, atau menggunakan dependensi dari npm atau sumber pihak ketiga lainnya, pastikan Anda menelusuri kode versi dikompilasi, karena versi tersebut sedang dievaluasi oleh app store. Jika Anda masih tidak dapat menemukan masalah, langkah berikutnya adalah menghubungi Dukungan One Stop. Mereka dapat menjelaskan pelanggaran spesifik, dan apa yang diperlukan agar ekstensi dipublikasikan sesegera mungkin.

Apa yang harus dilakukan jika library meminta kode

Terlepas dari dari mana kode berasal, tidak diperbolehkan memiliki RHC. 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 permintaan agar tidak menyertakan kode untuk memulai. Jika Anda mengalami masalah yang bukan kode Anda yang memuat RHC, tetapi library yang Anda gunakan, tindakan terbaik adalah menghubungi penulis library. Beri tahu mereka bahwa hal ini terjadi, dan minta solusi alternatif atau update kode untuk menghapusnya.

Bagaimana jika Anda sudah tidak sabar menunggu update library

Beberapa library akan mengirimkan update segera setelah diberi tahu, tetapi library lain mungkin akan diabaikan atau memerlukan waktu untuk mengatasi masalah tersebut. Bergantung pada hal yang terjadi dalam pelanggaran tertentu, Anda mungkin tidak perlu menunggunya dipindahkan untuk dibatalkan pemblokirannya dan menyelesaikan peninjauan yang berhasil. Ada sejumlah opsi yang tersedia untuk mengaktifkan kembali dan menjalankannya dengan cepat.

Mengaudit kode

Apakah Anda yakin bahwa kode yang menyebabkan permintaan ini diperlukan? Jika dapat dihapus begitu saja, atau library yang menyebabkannya dapat dihapus, 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 menemukan opsi lain yang memenuhi kasus penggunaan yang sama.

Pohon guncangan

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

Spesifikasi tentang cara mengimplementasikan treehaking tergantung pada proyek spesifik Anda. Namun, untuk menggunakan Rollup sebagai contoh sederhana, Anda dapat menambahkan treehaking hanya dengan mengompilasi kode project. Misalnya, jika Anda memiliki file yang hanya berisi log ke Firebase Auth, bernama main.js:

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

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

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

Dengan menjalankan perintah tersebut di jendela terminal, Anda akan menerima versi file main.js yang dihasilkan, yang semuanya dikompilasi ke dalam satu file bernama compiled.js.

Penggabungan 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 lebih efisien, dan dalam hal ini, masalah kode yang dihosting jarak jauh akan diperbaiki.

Pengeditan file secara otomatis

Cara yang semakin umum digunakan kode yang dihosting dari jarak jauh untuk memasukkan codebase Anda adalah sebagai subdependensi library yang Anda sertakan. Jika library X ingin import library Y dari CDN, Anda masih perlu mengupdatenya untuk membuatnya 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 penggabungan 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, sub-dependensi, atau di mana pun.

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

Pengeditan file secara manual

Opsi paling sederhana adalah menghapus kode yang menyebabkan RHC. Buka di editor teks pilihan Anda, dan hapus baris yang melanggar. Hal ini umumnya tidak disarankan, karena rapuh dan dapat dilupakan. Pendekatan ini membuat pengelolaan project Anda lebih sulit jika file bernama "library.min.js" bukan sebenarnya library.min.js. Alih-alih mengedit file mentah, opsi yang sedikit lebih dapat dikelola adalah menggunakan alat seperti patch-package. Ini adalah opsi yang sangat efektif yang memungkinkan Anda menyimpan modifikasi ke file, bukan file itu sendiri. Library ini dibuat pada file patch, sama seperti yang mendukung sistem kontrol versi seperti Git atau Subversion. Anda hanya perlu memodifikasi kode yang melanggar secara manual, menyimpan file diff, dan mengonfigurasi patch-package dengan perubahan yang ingin diterapkan. Anda dapat membaca tutorial lengkap tentang readme project. Jika Anda mem-patch project, kami sangat menyarankan Anda untuk menghubungi project tersebut guna meminta agar perubahan diterapkan pada upstream. Meskipun paket patch membuat pengelolaan patch menjadi jauh lebih mudah, tidak ada patch lain yang akan lebih baik lagi.

Apa 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 menjalankan RHC, kode tersebut harus dihapus. Tidak masalah apakah perangkat sudah mati atau tidak digunakan. Jika tidak digunakan, library tersebut harus dihapus, baik dengan treehaking, atau patch pada library untuk menghapusnya.

Apakah ada ada solusi?

Secara umum, tidak. RHC tidak diizinkan. Namun, ada sejumlah kecil kasus yang diizinkan. Ini hampir selalu kasus di mana tidak mungkin untuk menggunakan opsi lain.

API Skrip Pengguna

Skrip Pengguna adalah cuplikan kode kecil yang biasanya disediakan oleh pengguna, yang ditujukan untuk pengelola Skrip Pengguna seperti TamperMonkey dan hardMonkey. Pengelola ini tidak dapat memaketkan kode yang ditulis oleh pengguna, sehingga User Script API menampilkan cara untuk mengeksekusi kode yang diberikan oleh pengguna. Ini bukan pengganti untuk chrome.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 selain yang dimaksudkan (yaitu kode yang diberikan oleh pengguna), aplikasi dapat ditolak atau listingan tersebut dihapus dari Play Store.

chrome.debugger

chrome.debugger API memberi ekstensi kemampuan untuk berinteraksi dengan Chrome Devtools Protocol. Protokol ini sama dengan yang digunakan untuk Devtools Chrome, dan banyak lagi alat lainnya. Dengan ekstensi ini, ekstensi dapat meminta dan mengeksekusi kode jarak jauh. Sama seperti skrip pengguna, skrip ini bukan pengganti chrome.scripting, dan memiliki pengalaman pengguna yang jauh lebih signifikan. Saat digunakan, pengguna akan melihat panel peringatan di bagian atas jendela. Jika banner ditutup atau ditutup, sesi proses debug akan dihentikan.

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

Iframe dengan sandbox

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

Jika Anda memiliki kasus penggunaan yang belum tercakup, hubungi tim menggunakan milis chromium-extensions untuk mendapatkan masukan, atau buka tiket baru untuk meminta panduan dari Dukungan Terlengkap

Yang harus dilakukan jika Anda tidak setuju dengan suatu putusan

Menegakkan kebijakan dapat bernuansa dan peninjauan melibatkan input manual, yang berarti tim Chrome Web Store terkadang dapat setuju untuk mengubah keputusan peninjauan. Jika Anda yakin telah melakukan kesalahan dalam peninjauan, Anda dapat mengajukan banding menggunakan Dukungan One Stop