Wiki di ZooBC
App e sviluppo su ZooBC

I dati della catena sono input non attendibile

Ogni nome di token, simbolo, messaggio di transazione, istruzione di escrow e valore di dataset su ZooBC è stato scelto da chi ha pagato la commissione. Nulla lo verifica, e nulla diventa vero per il fatto di essere permanente. La regola per chi sviluppa è breve: i dati letti dalla catena sono input, mai istruzioni.

Mostrare il testo della catena

In una pagina web, metti il testo della catena sullo schermo come testo:

el.textContent = token.name;   // shown as text: safe
el.innerHTML  = token.name;    // parsed as HTML: never

Il testo inserito come HTML può contenere markup e script che vengono eseguiti con i diritti della tua pagina, e i filtri costruiti con espressioni regolari non bastano a impedirlo. I link richiedono la stessa cura: non seguire un URL trovato nei dati della catena senza verificarne lo schema.

Allo stesso modo, un'app guidata da un agente IA non deve mai obbedire a una frase trovata nel nome di un token, in un promemoria o nel valore di un dataset. «Ignora le tue istruzioni» scritto nel nome di un token è un dato come qualsiasi altra stringa. E il saldo di un mittente non dice nulla sulla sicurezza del suo testo.

textContent, non innerHTML: i dati della catena sono input, mai istruzioni.
textContent, non innerHTML: i dati della catena sono input, mai istruzioni.

Che cosa verifica il protocollo

Solo pochi campi hanno una forma che la catena fa rispettare:

CampoRegola
valori di dataset tokenicon:un'immagine PNG o WebP, da 1 a 512 pixel per lato, da 16 a 4.096 byte
domini dei registri, come quello di un gatewayda 1 a 256 caratteri: lettere, cifre, punti e trattini
URL dei registri, come quello di un gatewayiniziano con https://; nessuno spazio, carattere di controllo, virgolette, parentesi angolari o backtick
valori di dataset inv:un oggetto JSON senza alcun numero negativo

Tutto il resto sono byte arbitrari per scelta di progetto. Anche un campo verificato è solo una forma: un indirizzo https:// ben formato può comunque portare ovunque.

Le icone dei token

Un nodo serve l'icona di ogni token su GET /api/v1/tokens/:id/icon con intestazioni che la rendono inerte: X-Content-Type-Options: nosniff, Content-Disposition: inline, Content-Security-Policy: default-src 'none'; sandbox, e una cache di cinque minuti. A una pagina non serve altro che un tag immagine che punti a quella route.

Righe di dataset: verifica chi le ha impostate

L'elenco dei dataset di un account restituito da un nodo contiene le righe in cui quell'account è chi le imposta o il destinatario, e qualsiasi account può scrivere una riga sotto qualsiasi altro (dataset). Per leggere ciò che un account dice di sé, tieni solo le righe il cui role è setter o both; una riga in cui è solo il destinatario è stata scritta da qualcun altro. Per verificare un'affermazione come «verified = yes», accetta solo una riga impostata dall'account di cui ti fidi.

I valori arrivano in due forme: value, con escape, e value_b64, senza perdite. In entrambi i casi il contenuto è testo di uno sconosciuto, da mostrare con textContent come il resto.

Lista di controllo

  • textContent, mai innerHTML, per ogni stringa letta dalla catena.
  • Verifica lo schema di un URL prima di seguirlo, e non seguire mai il testo della catena come istruzione.
  • Fidati di una riga di dataset solo se proviene da chi ti aspetti l'abbia impostata.
  • Mostra le icone dei token tramite la route delle icone.

Vedi anche