Chromium Chronicle #15: Hedef Görünürlüğü Kısıtlama

15. Bölüm: Joe Mason, Montreal, PQ'da (Kasım 2020)
Önceki bölümler

Chrome, birçok alt sistemi olan büyük bir projedir. Kod bulmak yaygın bir durumdur başka bir yerde yararlı olabilecek ancak gizli kalmış bir bileşen için yazılmıştır kısıtlamalar. Güvenliğiniz için tehlikeli işlevlere dışarıdan erişimi sınırlandırın. Örneğin, belirli performans ihtiyaçları için ayarlanmış özel bir işlev:

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

Erişimi kısıtlamanın birkaç yolu vardır. GN görünürlük kuralları durdurma kodu haricindeki herhangi bir bileşeni kontrol edin. Varsayılan olarak hedefler herkes görebilir ancak bunu değiştirebilirsiniz:

# 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" ]
}

Görünürlük bildirimleri gn check ile doğrulanır ve bu işlem en önemli işlevimiz var.

Diğer bir mekanizma olan DEPS include_rules, başlık dosyalarına erişimi sınırlandırır. Her dizin, üst kuruluş biriminden include_rules alanını devralır ve bu dizinleri değiştirebilir kendi DEPS dosyasında bulabilirsiniz. dışından eklenen tüm başlık dosyaları dizinlere include_rules tarafından izin verilmelidir.

# 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",
]

Bu bağımlılıkların uygun olduğundan emin olmak için dizine yönlendiren değişiklikler ve to include_rules; ilgili dizinin OWNERS öğesi tarafından onaylanmalıdır. Sıra No: include_rules kullanılarak bir dizinin kısıtlanması için onay gerekiyor! Şunları yapabilirsiniz: bileşeninizi değiştiren herkesin, belirli bileşenleri başlıklarına teklif vermek için include_rule ekleyin.

include_rules, ön gönderimde kontrol edildiğinden herhangi bir uyarı görmeyeceksiniz. bir değişiklik yüklemeye çalışana kadar. include_rules uygulamasını kullanmadan test etmek için yükleniyor, buildtools/checkdeps/checkdeps.py <directory> çalıştırın.

Kaynaklar