Xử lý các vi phạm về mã được lưu trữ từ xa

Cửa hàng Chrome trực tuyến có mã được lưu trữ từ xa (hay RHC) là mã được Cửa hàng Chrome trực tuyến thực thi và được tải từ một nơi nào đó ngoài tệp của tiện ích. Những thứ như JavaScript và WASM. Thuộc tính này không bao gồm dữ liệu hay những nội dung như JSON hoặc CSS.

Tại sao RHC không còn được cho phép?

Với các tiện ích Manifest V3, giờ đây, các tiện ích đó cần phải nhóm tất cả mã mà chúng đang sử dụng vào trong chính tiện ích đó. Trước đây, bạn có thể tự động chèn thẻ tập lệnh từ bất kỳ URL nào trên web.

Tôi được thông báo rằng tiện ích của mình có RHC. Nội dung có vấn đề gì?

Nếu tiện ích của bạn bị từ chối trong quá trình xem xét do lỗi Blue Argon, thì nhân viên đánh giá của chúng tôi cho rằng tiện ích của bạn đang sử dụng mã được lưu trữ từ xa. Đây thường là kết quả của việc một tiện ích cố gắng thêm thẻ tập lệnh bằng một tài nguyên từ xa (ví dụ: từ web mở, thay vì các tệp có trong tiện ích) hoặc tìm nạp tài nguyên để thực thi trực tiếp.

Cách phát hiện RHC

Việc phát hiện RHC không phải là quá khó nếu bạn đã biết cần tìm nội dung gì. Trước tiên, hãy kiểm tra các chuỗi "http://" hoặc "https://" trong dự án của bạn. Nếu có lỗi vi phạm về RHC, bạn có thể xác định được lỗi vi phạm bằng cách tìm lỗi đó. Nếu bạn có một hệ thống xây dựng đầy đủ hoặc sử dụng các phần phụ thuộc từ npm hoặc các nguồn khác của bên thứ ba, hãy đảm bảo rằng bạn đang tìm kiếm phiên bản đã biên dịch của mã, vì đó là phiên bản đang được cửa hàng đánh giá. Nếu bạn vẫn không thể tìm ra vấn đề, bước tiếp theo là liên hệ với Bộ phận hỗ trợ toàn diện. Họ sẽ có thể nêu rõ các lỗi vi phạm cụ thể, cũng như những điều cần thiết để phát hành tiện ích này sớm nhất có thể.

Việc cần làm nếu thư viện yêu cầu mã

Bất kể mã đến từ đâu, mã đó đều không được phép có RHC. Mã này bao gồm mã mà bạn không phải là tác giả nhưng tình cờ sử dụng làm phần phụ thuộc trong dự án của bạn. Một số nhà phát triển sử dụng Firebase gặp vấn đề này khi mã từ xa được đưa vào để sử dụng trong tính năng Xác thực Firebase. Mặc dù đây là thư viện của bên thứ nhất (tức là do Google sở hữu), nhưng không có trường hợp ngoại lệ nào đối với RHC. Bạn cần định cấu hình mã để xoá RHC hoặc cập nhật ý kiến để không bao gồm mã vào đầu. Nếu bạn gặp phải sự cố không phải là mã của bạn đang tải RHC mà là thư viện bạn đang sử dụng, thì cách hành động tốt nhất là liên hệ với tác giả của thư viện đó. Hãy cho họ biết rằng điều này đang xảy ra và yêu cầu giải pháp hoặc cập nhật mã để xoá vấn đề.

Nếu bạn không đợi được bản cập nhật thư viện thì sao

Một số thư viện sẽ gửi bản cập nhật gần như ngay lập tức sau khi nhận được thông báo, nhưng một số thư viện khác có thể bị bỏ qua hoặc mất thời gian để giải quyết vấn đề. Tuỳ thuộc vào điều gì đang xảy ra ở lỗi vi phạm cụ thể, bạn có thể không cần phải đợi những lỗi vi phạm đó chuyển đi để được bỏ chặn và hoàn tất quy trình xem xét thành công. Hiện có một số tuỳ chọn giúp sao lưu và chạy nhanh chóng.

Kiểm tra mã

Bạn có chắc chắn rằng mã gây ra yêu cầu là cần thiết không? Nếu chỉ có thể xoá mã hoặc thư viện gây ra lỗi, bạn có thể xoá mã đó và công việc đã hoàn tất.

Ngoài ra, có thư viện nào khác cung cấp các tính năng tương tự không? Hãy thử kiểm tra npmjs.com, GitHub hoặc các trang web khác để biết các lựa chọn khác đáp ứng cùng trường hợp sử dụng.

Cây rung chuyển

Nếu mã gây ra lỗi vi phạm RHC không thực sự được dùng, thì hệ thống có thể tự động xoá mã này bằng công cụ. Các công cụ xây dựng hiện đại như webpack, RollupVite (chỉ một số công cụ) có một tính năng tên là lắc cây. Sau khi được bật trên hệ thống xây dựng, kỹ thuật rung cây sẽ xoá mọi đường dẫn mã không được sử dụng. Điều này có nghĩa là bạn không chỉ có một phiên bản mã tuân thủ chính sách hơn, mà còn có một phiên bản đơn giản hơn và nhanh hơn! Điều quan trọng cần lưu ý là không phải tất cả các thư viện đều có thể bị rung cây, nhưng có nhiều thư viện thì như vậy. Một số công cụ, như Rollup và Vite, đã bật tính năng rung cây theo mặc định. Bạn cần định cấu hình gói web để bật tính năng này. Nếu bạn không sử dụng hệ thống xây dựng trong tiện ích nhưng đang sử dụng thư viện mã, thì bạn thực sự nên điều tra việc thêm công cụ xây dựng vào quy trình làm việc. Các công cụ xây dựng giúp bạn viết các dự án an toàn, đáng tin cậy và dễ bảo trì hơn.

Chi tiết cụ thể về cách triển khai hành trình xuyên cây tuỳ thuộc vào dự án cụ thể của bạn. Tuy nhiên, để lấy một ví dụ đơn giản với tính năng Rollup, bạn có thể thêm tính năng khám phá cây chỉ bằng cách biên dịch mã dự án. Ví dụ: nếu bạn có một tệp chỉ đăng nhập vào Xác thực Firebase, có tên 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);
  }
});

Sau đó, bạn chỉ cần cho Rollup biết tệp đầu vào, một trình bổ trợ cần thiết để tải các tệp nút @rollup/plugin-node-resolve và tên của tệp đầu ra mà trình bổ trợ đang tạo.

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

Khi chạy lệnh đó trong một cửa sổ dòng lệnh, bạn sẽ nhận được phiên bản được tạo của tệp main.js, tất cả được biên dịch thành một tệp có tên là compiled.js.

Quá trình hợp nhất có thể đơn giản nhưng cũng rất dễ định cấu hình. Bạn có thể thêm tất cả các loại logic và cấu hình phức tạp, chỉ cần xem tài liệu của chúng. Việc thêm công cụ bản dựng như thế này sẽ dẫn đến mã trở nên nhỏ hơn, hiệu quả hơn và trong trường hợp này, sẽ khắc phục vấn đề về mã được lưu trữ từ xa.

Tự động chỉnh sửa tệp

Một cách ngày càng phổ biến mà mã được lưu trữ từ xa có thể nhập vào cơ sở mã của bạn là phần phụ thuộc của thư viện mà bạn đang đưa vào. Nếu thư viện X muốn import thư viện Y từ một CDN, bạn vẫn cần phải cập nhật thư viện đó để tải được từ một nguồn cục bộ. Với các hệ thống xây dựng hiện đại, bạn có thể dễ dàng tạo các trình bổ trợ để trích xuất một tệp tham chiếu từ xa và nội tuyến tệp đó trực tiếp vào mã của mình.

Điều đó có nghĩa là mã đã cung cấp sẽ có dạng như sau:

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

Bạn có thể tạo một trình bổ trợ tổng hợp nhỏ.

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

Sau khi bạn chạy bản dựng bằng trình bổ trợ mới, mọi URL import từ xa sẽ được phát hiện, bất kể đó là mã của chúng ta, phần phụ thuộc phụ, phần phụ thuộc phụ hay bất kỳ nơi nào khác.

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

Chỉnh sửa tệp theo cách thủ công

Lựa chọn đơn giản nhất là xoá mã gây ra RHC. Mở trong trình chỉnh sửa văn bản mà bạn chọn và xoá các dòng vi phạm. Nhìn chung, bạn không nên làm như vậy vì phương pháp này dễ bị quên. Điều này khiến bạn khó duy trì dự án hơn khi tệp có tên là "library.min.js" không thực sự là library.min.js. Thay vì chỉnh sửa các tệp thô, một lựa chọn dễ bảo trì hơn một chút là sử dụng một công cụ như patch-package. Đây là một tuỳ chọn siêu hiệu quả cho phép bạn lưu các nội dung sửa đổi vào một tệp, thay vì lưu chính tệp đó. API này được xây dựng trên tệp bản vá, tương tự như thứ hỗ trợ các hệ thống quản lý phiên bản như Git hoặc Subversion. Bạn chỉ cần sửa đổi mã vi phạm theo cách thủ công, lưu tệp so sánh và định cấu hình gói bản vá với các thay đổi mà bạn muốn áp dụng. Bạn có thể đọc hướng dẫn đầy đủ trên readme của dự án. Nếu đang vá một dự án, bạn thực sự nên liên hệ với dự án đó để yêu cầu thực hiện các thay đổi. Mặc dù gói bản vá giúp quản lý các bản vá dễ dàng hơn rất nhiều, nhưng không có bản vá nào lại tốt hơn nữa.

Việc cần làm nếu mã này không được sử dụng

Khi cơ sở mã tăng lên, các phần phụ thuộc (hoặc phần phụ thuộc của một phần phụ thuộc hay phần phụ thuộc của...) có thể giữ lại các đường dẫn mã không còn được sử dụng nữa. Nếu một trong các phần đó bao gồm mã để tải hoặc thực thi RHC, thì phần đó sẽ phải bị xoá. Việc mô-đun này đã bị hỏng hoặc chưa được sử dụng cũng không quan trọng. Nếu thư viện không được sử dụng, bạn nên xoá thư viện bằng cách chẻ cây hoặc vá thư viện để xoá thư viện.

giải pháp nào không?

Nói chung là không. RHC không được phép. Tuy nhiên, có một số ít trường hợp được cho phép. Hầu như luôn xảy ra những trường hợp như vậy.

API Tập lệnh người dùng

Tập lệnh người dùng là các đoạn mã nhỏ thường do người dùng cung cấp, dành cho những người quản lý Tập lệnh người dùng như TamperMonkeyviolationRub. Các trình quản lý này không thể gói mã do người dùng viết, vì vậy, API Tập lệnh người dùng sẽ cho thấy cách thực thi mã do người dùng cung cấp. Thư viện này không thay thế cho chrome.scripting.executeScript hay các môi trường thực thi mã khác. Người dùng phải bật chế độ nhà phát triển để thực thi mọi thứ. Nếu nhóm xem xét Cửa hàng Chrome trực tuyến cho rằng ứng dụng đang được sử dụng theo cách khác với mục đích sử dụng (tức là mã do người dùng cung cấp), thì có thể ứng dụng đó sẽ bị từ chối hoặc trang thông tin bị gỡ khỏi cửa hàng.

chrome.debugger

API chrome.debugger cung cấp cho các tiện ích khả năng tương tác với Giao thức công cụ của Chrome cho nhà phát triển. Đây cũng là giao thức được dùng cho các công cụ cho nhà phát triển của Chrome và một số lượng lớn các công cụ khác. Nhờ tiện ích này, tiện ích có thể yêu cầu và thực thi mã từ xa. Cũng giống như tập lệnh người dùng, API này không thay thế cho chrome.scripting và mang lại trải nghiệm người dùng đáng chú ý hơn. Trong khi sử dụng, người dùng sẽ thấy một thanh cảnh báo ở đầu cửa sổ. Nếu biểu ngữ bị đóng hoặc bị đóng, phiên gỡ lỗi sẽ bị chấm dứt.

Ảnh chụp màn hình thanh địa chỉ trong Chrome có thông báo "Tiện ích trình gỡ lỗi đã bắt đầu gỡ lỗi trình duyệt này"
Ảnh chụp màn hình thanh địa chỉ trong Chrome có thông báo "Tiện ích trình gỡ lỗi đã bắt đầu gỡ lỗi trình duyệt này"

iframe hộp cát

Nếu cần đánh giá một chuỗi dưới dạng mã và đang ở trong môi trường DOM (ví dụ: tập lệnh nội dung, trái ngược với trình chạy dịch vụ tiện ích), thì bạn có thể sử dụng iframe hộp cát. Theo mặc định, các tiện ích không hỗ trợ những nội dung như eval() để đảm bảo an toàn. Mã độc hại có thể khiến người dùng gặp rủi ro về bảo mật và an toàn. Tuy nhiên, khi mã chỉ được thực thi trong một môi trường an toàn đã biết, chẳng hạn như iframe đã được tạo hộp cát từ phần còn lại của web, những rủi ro đó sẽ giảm đáng kể. Trong ngữ cảnh này, Chính sách bảo mật nội dung chặn việc sử dụng eval có thể được gỡ bỏ, cho phép bạn chạy bất kỳ mã JavaScript hợp lệ nào.

Nếu bạn có trường hợp sử dụng chưa được đề cập, vui lòng liên hệ với nhóm bằng cách sử dụng danh sách gửi thư chromium-extensions để lấy ý kiến phản hồi hoặc mở một phiếu yêu cầu hỗ trợ mới để yêu cầu hướng dẫn từ Bộ phận hỗ trợ một điểm

Việc cần làm nếu bạn không đồng ý với một kết quả

Việc thực thi chính sách có thể được xem xét phức tạp và quá trình xem xét có liên quan đến việc nhập thủ công. Điều này có nghĩa là nhóm Cửa hàng Chrome trực tuyến đôi khi có thể đồng ý thay đổi quyết định đánh giá. Nếu cho rằng đã có nhầm lẫn trong quá trình xem xét, bạn có thể khiếu nại quyết định từ chối này bằng cách sử dụng dịch vụ Hỗ trợ một điểm