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ähigkeit | Gewährt Zugriff auf |
|---|---|
content:read | ctx.content.get(), ctx.content.list() |
content:write | ctx.content.create(), ctx.content.update(), ctx.content.delete() (impliziert content:read) |
taxonomies:read | ctx.taxonomies.getAll(), ctx.taxonomies.getTerms(), ctx.taxonomies.getEntryTerms() |
media:read | ctx.media.get(), ctx.media.list() |
media:write | ctx.media.getUploadUrl(), ctx.media.upload(), ctx.media.delete() (impliziert media:read) |
network:request | ctx.http.fetch() — beschränkt auf allowedHosts |
network:request:unrestricted | ctx.http.fetch() ohne Host-Beschränkung |
users:read | ctx.users.get(), ctx.users.getByEmail(), ctx.users.list() |
email:send | ctx.email.send() (erfordert einen konfigurierten E-Mail-Provider) |
hooks.email-transport:register | Registrierung des exklusiven email:deliver Hooks |
hooks.email-events:register | Registrierung von email:beforeSend / email:afterSend Hooks |
hooks.page-fragments:register | Registrierung des page:fragments Hooks (nur native Plugins) |
- Implikationen.
content:writeimpliziert automatischcontent:read;media:writeimpliziertmedia:read. - Taxonomien sind eine separate, schreibgeschützte Oberfläche.
network:request:unrestrictedexistiert für vom Benutzer konfigurierte URLs.email:sendwird 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
- Fähigkeitskontrolle. Der PluginContext füllt nur deklarierte Fähigkeiten.
- Storage- und KV-Scoping. Jede Operation ist auf den Plugin-Slug beschränkt.
- Netzwerkisolation. Direktes
fetch()ist blockiert. - Keine Host-Bindings. Sandboxed Plugins sehen keine Umgebungsvariablen oder das Dateisystem.
- 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:writekann 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.