ZooBC ウィキ
アプリと ZooBC での開発

チェーンデータは信頼できない入力

ZooBC 上のすべてのトークン名、シンボル、トランザクションのメッセージ、エスクローの指示、データセットの値は、手数料を支払った者が選んだものです。それを審査するものは何もなく、永続的であるからといって何かが真実になるわけでもありません。作り手のためのルールは短いものです。チェーンから読んだデータは入力であって、決して指示ではありません。

チェーン上のテキストを表示する

ウェブページでは、チェーン上のテキストをテキストとして画面に表示してください。

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

HTML として挿入されたテキストは、ページの権限で実行されるマークアップやスクリプトを運ぶことができ、正規表現で作ったフィルターではそれを止めるのに十分ではありません。リンクにも同じ注意が必要です。チェーンデータの中で見つけた URL を、そのスキームを確認せずにたどらないでください。

AI エージェントが動かすアプリも同様に、トークン名、メモ、データセットの値の中で見つけた文に決して従ってはなりません。トークン名に書かれた「指示を無視せよ」は、他のどの文字列とも同じデータです。そして送信者の残高は、そのテキストが安全かどうかについて何も語りません。

innerHTML ではなく textContent:チェーンデータは入力であって、決して指示ではありません。
innerHTML ではなく textContent:チェーンデータは入力であって、決して指示ではありません。

プロトコルが確認するもの

チェーンが形式を強制するフィールドは、ほんのわずかです。

フィールドルール
tokenicon: のデータセットの値PNG または WebP の画像で、縦横それぞれ 1 から 512 ピクセル、16 から 4,096 バイト
ゲートウェイのものなど、レジストリのドメイン1 から 256 文字:英字、数字、ドット、ハイフン
ゲートウェイのものなど、レジストリの URLhttps:// で始まり、空白、制御文字、引用符、山かっこ、バッククォートを含まない
inv: のデータセットの値どこにも負の数を含まない JSON オブジェクト

それ以外はすべて、設計上、任意のバイト列です。確認されるフィールドでさえ、確認されるのは形式だけです。正しい形式の https:// アドレスでも、どこへでもつながりえます。

トークンのアイコン

ノードは各トークンのアイコンを GET /api/v1/tokens/:id/icon で、それを無害に保つヘッダーとともに提供します。X-Content-Type-Options: nosniff、Content-Disposition: inline、Content-Security-Policy: default-src 'none'; sandbox、そして 5 分間のキャッシュです。ページに必要なのは、そのルートを指す画像タグだけです。

データセットの行:設定者を確認する

あるアカウントについてのノードのデータセットの一覧は、そのアカウントが設定者または受取人である行を返し、どのアカウントも他のどのアカウントの下にでも行を書くことができます(データセット)。あるアカウントが自分自身について述べていることを読むには、role が setter または both の行だけを残してください。受取人であるだけの行は、他の誰かが書いたものです。「verified = yes」のような主張を確認するには、設定者が信頼するアカウントである行だけを受け入れてください。

値は 2 つの形式で届きます。エスケープされた value と、情報を失わない value_b64 です。どちらにしても中身は見知らぬ人のテキストであり、他と同じように textContent で表示すべきものです。

チェックリスト

  • チェーンから読んだすべての文字列に、innerHTML ではなく textContent を使います。
  • URL はたどる前にスキームを確認し、チェーン上のテキストを決して指示として従いません。
  • データセットの行は、想定した設定者からのものだけを信頼します。
  • トークンのアイコンはアイコンのルートを通じて表示します。

関連項目