INTEGRITY Dokumentace

Model viditelnosti a zabezpečení

Bezpečnostní model

Systém Workers RPC je určený k tomu, aby umožnil bezpečnou komunikaci mezi Workery, které si navzájem nedůvěřují. Systém neumožňuje žádné straně RPC relace přistupovat k libovolným objektům na druhé straně, natož vyvolávat libovolný kód. Každá strana může místo toho volat pouze objekty a funkce, pro které už dříve výslovně obdržela stuby prostřednictvím předchozích volání.

Tento bezpečnostní model je běžně známý jako Object Capabilities neboli Capability-Based Security. Workers RPC je postaveno na Cap'n Proto RPC, který zase vychází z CapTP, protokolu pro přenos objektů používaného distribuovaný programovací jazyk E.

Viditelnost metod a vlastností

Soukromé vlastnosti

Soukromé vlastnosti tříd nejsou přímo dostupné přes RPC.

Šipkové funkce

Výrazy šipkových funkcí nejsou vystaveny přes RPC, protože jsou definovány na instancích třídy, nikoli na prototypu třídy. Ony by se neměly používat jako metody třídy z WorkerEntrypoint tříd.

import { WorkerEntrypoint } from "cloudflare:workers";

export default class extends WorkerEntrypoint {
  // add() is exposed over RPC.
  add(a, b) {
    return a + b;
  }

  // subtract() is NOT exposed over RPC.
  subtract = (a, b) => a - b;
}

Vlastnosti instance třídy

Když odešlete instanci třídy definované aplikací, příjemce může přistupovat pouze k metodám a vlastnostem deklarovaným na dané třídě, nikoli k vlastnostem instance. Příklad:

class Foo extends RpcTarget {
  constructor() {
    super();

    // i CANNOT be accessed over RPC
    this.i = 0;

    // funcProp CANNOT be called over RPC
    this.funcProp = () => {}
  }

  // value CAN be accessed over RPC
  get value() {
    return this.i;
  }

  // method CAN be called over RPC
  method() {}
}

Toto chování je záměrné: má vás chránit před nechtěným odhalením soukromých vnitřních prvků třídy. Instanční vlastnosti by obecně měly být deklarovány jako privátní, přidáním předpony #. Privátní vlastnosti jsou ale poměrně nová funkce JavaScriptu a v ekosystému se zatím široce nepoužívají.

Protože RPC rozhraní mezi dvěma vašimi Workery může tvořit bezpečnostní hranici, musíme být obzvlášť opatrní, a proto jsou vlastnosti instance při komunikaci mezi Workery přes RPC vždy soukromé, bez ohledu na to, zda mají # prefix. Pokud chcete danou vlastnost zpřístupnit, můžete na úrovni třídy vždy deklarovat explicitní getter, jak je uvedeno výše.

Tato pravidla viditelnosti platí pouze pro objekty, které rozšiřují RpcTarget, WorkerEntrypoint, nebo DurableObject, a nevztahuje se na obyčejné objekty. Obyčejné objekty se předávají „hodnotou“ a odesílají se všechny jejich „vlastní“ vlastnosti.

"Own" properties of functions

Když funkci předáte přes RPC, volající může přistupovat k „vlastním“ (own) vlastnostem samotného objektu funkce.

someRpcMethod() {
  let func = () => {};
  func.prop = 123;  // `prop` is visible over RPC
  return func;
}

K takovým vlastnostem funkce se přistupuje asynchronně, podobně jako ke třídním vlastnostem RpcTarget. Na rozdíl od RpcTarget příkladu výše jsou vlastnosti instance funkce, ke kterým má volající přístup. V praxi se vlastnosti k funkcím přidávají jen zřídka.