Fähigkeiten und Sicherheit

Auf dieser Seite

Sandboxed Plugins sind standardmäßig isoliert. Um etwas über das Lesen und Schreiben ihres eigenen KV und Storage hinaus zu tun, muss ein Plugin eine Fähigkeit deklarieren in seinem Manifest. Die Sandbox-Bridge kontrolliert jede vom Host bereitgestellte API basierend auf diesen Deklarationen.

Fähigkeiten deklarieren

{
	"slug": "plugin-hello",
	"capabilities": ["content:read", "network:request"],
	"allowedHosts": ["api.example.com"]
}

Deklarieren Sie nur, was das Plugin tatsächlich benötigt.

Fähigkeitsreferenz

FähigkeitGewährt Zugriff auf
content:readctx.content.get(), ctx.content.list()
content:writectx.content.create(), ctx.content.update(), ctx.content.delete() (impliziert content:read)
taxonomies:readctx.taxonomies.getAll(), ctx.taxonomies.getTerms(), ctx.taxonomies.getEntryTerms()
media:readctx.media.get(), ctx.media.list()
media:writectx.media.getUploadUrl(), ctx.media.upload(), ctx.media.delete() (impliziert media:read)
network:requestctx.http.fetch() — beschränkt auf allowedHosts
network:request:unrestrictedctx.http.fetch() ohne Host-Beschränkung
users:readctx.users.get(), ctx.users.getByEmail(), ctx.users.list()
email:sendctx.email.send() (erfordert einen konfigurierten E-Mail-Provider)
hooks.email-transport:registerRegistrierung des exklusiven email:deliver Hooks
hooks.email-events:registerRegistrierung von email:beforeSend / email:afterSend Hooks
hooks.page-fragments:registerRegistrierung des page:fragments Hooks (nur native Plugins)
  • Implikationen. content:write impliziert automatisch content:read; media:write impliziert media:read.
  • Taxonomien sind eine separate, schreibgeschützte Oberfläche.
  • network:request:unrestricted existiert für vom Benutzer konfigurierte URLs.
  • email:send wird durch Konfiguration eingeschränkt, nicht nur durch die Fähigkeit.

Inhalt in einer Locale erstellen

const post = await ctx.content.create(
	"posts",
	{ title: "繁體中文" },
	{ locale: "zh-tw" },
);

Netzwerk-Host-Allowlists

"capabilities": ["network:request"],
"allowedHosts": [
	"api.example.com",
	"*.cdn.example.com"
]

Was die Sandbox durchsetzt

  1. Fähigkeitskontrolle. Der PluginContext füllt nur deklarierte Fähigkeiten.
  2. Storage- und KV-Scoping. Jede Operation ist auf den Plugin-Slug beschränkt.
  3. Netzwerkisolation. Direktes fetch() ist blockiert.
  4. Keine Host-Bindings. Sandboxed Plugins sehen keine Umgebungsvariablen oder das Dateisystem.
  5. Ressourcenlimits. Der Runner kann CPU-, Subrequest-, Wanduhr- und Speicherlimits durchsetzen.

Was die Sandbox nicht durchsetzt

  • Verhalten innerhalb einer gewährten Fähigkeit. Ein Plugin mit content:write kann jeden Inhalt bearbeiten.
  • Betreibervertrauen auf Node.js. Ohne Sandbox-Runner laufen Plugins im Prozess ohne Isolation.
  • Seitenkanäle. Timing, Log-Ausgaben und gespeicherte Daten sind sichtbar.

Fähigkeitszustimmung

Bei der Installation zeigt EmDash einen Zustimmungsdialog mit den deklarierten Fähigkeiten.

Build-Zeit-Validierung

emdash-plugin bundle und emdash-plugin publish führen zusätzliche Prüfungen durch.

Siehe Bundling und Veröffentlichung.