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.
Che cosa verifica il protocollo
Solo pochi campi hanno una forma che la catena fa rispettare:
| Campo | Regola |
|---|---|
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 gateway | da 1 a 256 caratteri: lettere, cifre, punti e trattini |
| URL dei registri, come quello di un gateway | iniziano 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, maiinnerHTML, 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.