Wiki ZooBC
Applis et développement sur ZooBC

Les données de la chaîne sont des entrées non fiables

Chaque nom de jeton, symbole, message de transaction, instruction de séquestre et valeur de jeu de données sur ZooBC a été choisi par celui qui a payé les frais. Rien ne les contrôle, et rien ne devient vrai du simple fait d’être permanent. La règle pour les développeurs est courte : les données lues sur la chaîne sont des entrées, jamais des instructions.

Afficher le texte de la chaîne

Dans une page web, affichez le texte de la chaîne en tant que texte :

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

Un texte inséré comme HTML peut contenir du balisage et des scripts qui s’exécutent avec les droits de votre page, et des filtres construits à partir d’expressions régulières ne suffisent pas à l’empêcher. Les liens demandent le même soin : ne suivez pas une URL trouvée dans les données de la chaîne sans vérifier son schéma.

De même, une appli pilotée par un agent IA ne doit jamais obéir à une phrase trouvée dans un nom de jeton, un mémo ou une valeur de jeu de données. «  Ignorez vos instructions  », écrit dans un nom de jeton, est une donnée comme n’importe quel autre texte. Et le solde d’un expéditeur ne dit rien sur la sûreté de son texte.

textContent, pas innerHTML : les données de la chaîne sont des entrées, jamais des instructions.
textContent, pas innerHTML : les données de la chaîne sont des entrées, jamais des instructions.

Ce que le protocole vérifie

Seuls quelques champs ont une forme que la chaîne impose :

ChampRègle
Valeurs de jeu de données tokenicon:une image PNG ou WebP de 1 à 512 pixels dans chaque dimension, de 16 à 4 096 octets
Domaines inscrits dans un registre, comme celui d’une passerelle1 à 256 caractères : lettres, chiffres, points et tirets
URL inscrites dans un registre, comme celle d’une passerellecommencent par https:// ; aucun espace, caractère de contrôle, guillemet, chevron ni accent grave
Valeurs de jeu de données inv:un objet JSON sans aucun nombre négatif

Tout le reste est constitué d’octets arbitraires, par conception. Même un champ vérifié n’est qu’une forme : une adresse https:// bien formée peut toujours mener n’importe où.

Icônes de jeton

Un nœud sert l’icône de chaque jeton à GET /api/v1/tokens/:id/icon avec des en-têtes qui la rendent inerte : X-Content-Type-Options: nosniff, Content-Disposition: inline, Content-Security-Policy: default-src 'none'; sandbox, et un cache de cinq minutes. Une page n’a besoin de rien de plus qu’une balise d’image pointant vers cette route.

Lignes de jeu de données : vérifiez l’auteur

La liste des jeux de données qu’un nœud renvoie pour un compte contient les lignes dont ce compte est l’auteur (setter) ou le destinataire, et n’importe quel compte peut écrire une ligne sous n’importe quel autre (jeux de données). Pour lire ce qu’un compte dit de lui-même, ne gardez que les lignes dont le role vaut «  setter  » ou «  both  » ; une ligne dont il n’est que le destinataire a été écrite par quelqu’un d’autre. Pour vérifier une affirmation telle que «  verified = yes  », n’acceptez qu’une ligne dont l’auteur est le compte auquel vous faites confiance.

Les valeurs se présentent sous deux formes : value, échappée, et value_b64, sans perte. Dans les deux cas, le contenu est le texte d’un inconnu, à afficher avec textContent comme le reste.

Liste de contrôle

  • textContent, jamais innerHTML, pour chaque texte lu sur la chaîne.
  • Vérifiez le schéma d’une URL avant de la suivre, et ne suivez jamais un texte de la chaîne comme une instruction.
  • Ne faites confiance à une ligne de jeu de données que si elle vient de l’auteur attendu.
  • Affichez les icônes de jeton par la route d’icône.

Voir aussi