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

Mã được lưu trữ từ xa (RHC) là mã mà Cửa hàng Chrome trực tuyến gọi là bất kỳ được thực thi bởi trình duyệt được tải từ một nơi nào đó không phải là tệp riêng của tiện ích mở rộng. Những thứ như JavaScript và WASM. Chính sách này không bao gồm hoặc những thứ tương tự như JSON hoặc CSS.

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

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

Tôi được biết máy tính của tôi 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 tin rằng tiện ích của bạn đang sử dụng mã được lưu trữ từ xa. Đây là thường là kết quả của việc tiện ích cố gắng thêm thẻ tập lệnh bằng điều khiển từ xa tài nguyên (ví dụ: từ web mở, thay vì các tệp được bao gồm 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ó khăn khi bạn đã biết cần tìm những gì. Đầu tiên, hãy kiểm tra chuỗi "http://" hoặc "https://" trong dự án của bạn. Nếu bạn có Vi phạm RHC thì bạn có thể xác định được chúng bằng cách tìm vi phạm đó. 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 phần phụ thuộc khác hãy đảm bảo bạn đang tìm kiếm phiên bản đã biên dịch của mã, vì cửa hàng đang đánh giá nội dung đó. Nếu bạn vẫn không thể tìm sự cố, thì bước tiếp theo là liên hệ với Bộ phận hỗ trợ toàn diện. Chúng nêu ra những lỗi vi phạm cụ thể và những điều cần thiết để được xuất bản sớm nhất có thể.

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

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

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

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 được thông báo, nhưng những người dùng 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 nội dung xảy ra với hành vi vi phạm cụ thể, bạn có thể không cần phải chờ họ được bỏ chặn và hoàn tất quá trình xem xét thành công. Có không ít các tùy chọn sẵn có để 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 có thể bị xóa hoặc thư viện gây ra thư viện gây ra tệp có thể bị xóa, sau đó xóa 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? Thử kiểm tra npmjs.com, GitHub hoặc các trang web khác để biết các tuỳ chọn khác đáp ứng những trường hợp sử dụng tương tự.

Cây rung lắc

Nếu mã gây ra lỗi vi phạm RHC không thực sự được sử dụng, thì mã đó có thể có thể tự động bị xoá bằng công cụ. Các công cụ xây dựng hiện đại như webpack, Tổng hợpVite (như một vài tính năng) có một tính năng có tên là Rung cây. Sau khi được bật trên hệ thống xây dựng, tính năng rung cây phải xoá mọi đường dẫn mã không dùng đến. Điều này có nghĩa là bạn không chỉ có của mã tuân thủ, nhưng cũng là phiên bản gọn gàng và nhanh hơn! Quan trọng là lưu ý rằng không phải tất cả thư viện đều có thể rung cây, nhưng có rất nhiều thư viện. Hơi nhiều như Cuộn lên và Vite, được bật tính năng rung cây theo mặc định. gói web cần được định cấu hình để bật tính năng này. Nếu bạn không sử dụng bản dựng hệ thống dưới dạng một phần của tiện ích, nhưng đang sử dụng thư viện mã, thì bạn chúng tôi khuyến khích bạn tìm hiểu việc thêm công cụ xây dựng vào quy trình làm việ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 kỹ thuật chăm sóc cây xanh 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ề công cụ hợp nhất, bạn có thể thêm thao tác với những cây xanh chỉ bằng cách biên dịch mã dự án của bạn. Ví dụ: nếu bạn có một tệp chỉ đăng nhập vào Xác thực Firebase, được gọi là 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 thông báo cho Rollup tệp nhập dữ liệu, 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 đầu ra tệp mà nó đang tạo.

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

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

Dữ liệu 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 về logic và cấu hình phức tạp, bạn chỉ cần xem tài liệu của chúng. Việc thêm công cụ xây dựng như thế này sẽ giúp mã nhỏ hơn, hiệu quả hơn, và trong trường hợp này, khắc phục vấn đề về mã được lưu trữ từ xa của chúng tôi.

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

Một cách ngày càng phổ biến để mã được lưu trữ từ xa có thể nhập cơ sở mã của bạn là làm phụ thuộc vào thư viện mà bạn đang đưa vào. Nếu thư viện X muốn import thư viện Y từ CDN, thì bạn vẫn cần phải cập nhật thư viện này để quảng cáo đó tải 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 ra các trình bổ trợ để trích xuất tham chiếu từ xa và đặt trực tiếp vào mã của bạn.

Điều đó có nghĩa là mã nhất định trông giố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 đều được phát hiện bất kể đó có phải là mã của chúng ta hay không, một phần phụ thuộc phụ, phụ thuộc hoặc 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 chỉ 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. Điều này thường là thì không nên làm như vậy vì nó dễ vỡ và dễ quên. Điều này giúp khó duy trì dự án hơn khi tệp "library.min.js" không thực tế là library.min.js. Thay vì chỉnh sửa các tệp thô, có thể bảo trì là sử dụng một công cụ như patch-package. Đây là một Super tuỳ chọn mạnh mẽ giúp bạn lưu nội dung sửa đổi vào một tệp, thay vì . Trình quản lý thẻ của Google được xây dựng dựa trên các tệp bản vá, giống như một loại nội dung hỗ trợ các hệ thống quản lý phiên bản như Git hoặc Phiên bản phụ. Bạn chỉ cần sửa đổi mã vi phạm theo cách thủ công, lưu tệp điểm khác biệt và định cấu hình patch-package bằng các thay đổi bạn muốn áp dụng. Bạn có thể đọc toàn bộ hướng dẫn trên readme của dự án. Nếu bạn sửa lỗi cho một dự án, chúng tôi thực sự bạn nên liên hệ với dự án để yêu cầu họ thực hiện các thay đổi thượng nguồn. Mặc dù gói bản vá giúp quản lý bản vá dễ dàng hơn nhiều, nhưng việc không có gì để vá thậm chí còn tốt hơn.

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

Khi cơ sở mã phát triển, các phần phụ thuộc of...) có thể giữ lại các đường dẫn mã không còn được sử dụng. Nếu một trong các phần đó thêm mã để tải hoặc thực thi RHC, thì bạn sẽ phải loại bỏ mã này. Nó dù nó đã hết hay không còn được sử dụng nữa. Nếu ứng dụng không được sử dụng, bạn nên đã bị xoá, bằng cách dùng Treehaking hoặc vá thư viện để xoá thư viện đó.

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

Nói chung là không. Không cho phép RHC. Tuy nhiên, có một số ít các trường hợp được cho phép. Đây hầu như luôn là những trường hợp xảy ra không thể với bất kỳ tuỳ chọn nào khác.

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 được cung cấp bởi dành cho người dùng, dành cho những người quản lý Tập lệnh người dùng như TamperMonkeyBạo lực. Những người quản lý này không thể nhóm mã do người dùng viết, vì vậy, API Tập lệnh Người dùng cho thấy cách thực thi mã do người dùng cung cấp. Tên này không thay thế cho chrome.scripting.executeScript hoặc 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 bất cứ nội dung gì. Nếu Cửa hàng Chrome trực tuyến Nhóm đánh giá của cửa hàng cho rằng thông tin này đang được sử dụng theo cách không phải như vậy dành cho (ví dụ: mã do người dùng cung cấp), nó có thể bị từ chối hoặc trang thông tin bị gỡ khỏi cửa hàng.

chrome.debugger

API chrome.debugger cho phép các tiện ích tương tác với Giao thức Chrome Devtools. Đây chính là giao thức được dùng cho Công cụ cho nhà phát triển của Chrome và vô số công cụ khác. Với nó, một có thể yêu cầu và thực thi mã từ xa. Giống như tập lệnh người dùng, phiên bản thay thế cho chrome.scripting và mang lại trải nghiệm người dùng đáng chú ý hơn nhiều. 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 đóng, phiên gỡ lỗi sẽ đã chấm dứt.

Ảnh chụp màn hình thanh địa chỉ trong Chrome với thông báo "Tiện ích 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 với thông báo "Tiện ích gỡ lỗi đã bắt đầu gỡ lỗi trình duyệt này"

iframe hộp cát

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

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

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

Việc thực thi chính sách có thể hơi phức tạp và quá trình xem xét cần có thông tin đầu vào thủ công, tức là nhóm Cửa hàng Chrome trực tuyến đôi khi có thể đồng ý thay đổi quyết định xem xét. Nếu bạn cho rằng có sự 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 đó sử dụng dịch vụ Hỗ trợ toàn diện