Chromium Chronicle #15: Hạn chế chế độ hiển thị mục tiêu

Tập 15: của Joe Mason in Montreal, PQ (tháng 11 năm 2020)
Các tập trước

Chrome là một dự án lớn với nhiều hệ thống phụ. Mọi người thường tìm thấy mã được viết cho một thành phần có thể hữu ích ở nơi khác, nhưng có thể bị ẩn hạn chế. Để đảm bảo an toàn, hãy giới hạn quyền truy cập từ bên ngoài vào chức năng nguy hiểm. Ví dụ: một hàm tuỳ chỉnh được điều chỉnh để đáp ứng những nhu cầu cụ thể về hiệu suất:

// Blazing fast for 2-char strings, O(n^3) otherwise.
std::string ConcatShortStringsFast(const std::string& a, const std::string& b);

Có một số cách để hạn chế quyền truy cập. Mã dừng theo quy tắc chế độ hiển thị GN ra bên ngoài thành phần khỏi phụ thuộc vào mục tiêu. Theo mặc định, các mục tiêu là hiển thị cho tất cả mọi người, nhưng bạn có thể sửa đổi nội dung đó:

# In components/restricted_component/BUILD.gn
visibility = [
  # Applies to all targets in this file.
  # Only the given targets can depend on them.
  "//components/restricted_component:*",
  "//components/authorized_other_component:a_single_target",
]
source_set("internal") {
  # This dangerous target should be locked down even more.
  visibility = [ "//components/restricted_component:privileged_target" ]
}

Phần khai báo chế độ hiển thị được xác thực bằng gn check, chạy như một phần của mỗi bản dựng GN.

Một cơ chế khác là DEPS include_rules, cơ chế này giới hạn quyền truy cập vào các tệp tiêu đề. Mọi thư mục đều kế thừa include_rules từ thư mục mẹ và có thể sửa đổi những thư mục đó trong tệp DEPS riêng. Tất cả các tệp tiêu đề được đưa vào từ bên ngoài include_rules phải cho phép các thư mục.

# In //components/authorized_other_component/DEPS
include_rules = [
  # Common directories like //base are inherited from
  # //components/DEPS or //DEPS. Also allow includes from
  # restricted_component, but not restricted_component/internal.
  "+components/restricted_component",
  "-components/restricted_component/internal",
  # But do allow a single header from internal, for testing.
  "+components/restricted_component/internal/test_support.h",
]

Để đảm bảo những phần phụ thuộc này phù hợp, các thay đổi sẽ thêm một thư mục vào include_rules phải được OWNERS của thư mục đó phê duyệt. Không cần phê duyệt để hạn chế một thư mục bằng include_rules! Bạn có thể đảm bảo rằng mọi người thay đổi thành phần của bạn sẽ nhớ không sử dụng tiêu đề bằng cách thêm include_rule cấm quảng cáo này.

include_rules đã được kiểm tra trong phần gửi trước nên bạn sẽ không thấy bất kỳ cho đến khi bạn cố tải lên một thay đổi. Để kiểm tra include_rules mà không cần đang tải lên, hãy chạy buildtools/checkdeps/checkdeps.py <directory>.

Tài nguyên