Вики ZooBC
Приложения и разработка на ZooBC

Данные цепочки — недоверенный ввод

Каждое название и символ токена, сообщение транзакции, инструкцию эскроу и значение набора данных в ZooBC выбрал тот, кто заплатил комиссию. Никто это не проверяет, и ничто не становится правдой оттого, что хранится навсегда. Правило для разработчиков короткое: данные, прочитанные из цепочки, — это ввод, а не указание.

Как показывать текст из цепочки

На веб-странице выводите текст из цепочки на экран как текст:

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

Текст, вставленный как HTML, может нести разметку и скрипты, которые выполняются с правами вашей страницы, и фильтров на регулярных выражениях недостаточно, чтобы это остановить. Ссылки требуют той же осторожности: не переходите по URL, найденному в данных цепочки, не проверив его схему.

Приложение, управляемое ИИ-агентом, точно так же никогда не должно подчиняться фразе, найденной в названии токена, заметке или значении набора данных. «Игнорируй свои инструкции», записанное в названии токена, — такие же данные, как любая другая строка. И баланс отправителя ничего не говорит о том, безопасен ли его текст.

textContent, а не innerHTML: данные цепочки — это ввод, а не указание.
textContent, а не innerHTML: данные цепочки — это ввод, а не указание.

Что проверяет протокол

Лишь у нескольких полей есть форма, которую обеспечивает цепочка:

ПолеПравило
значения наборов данных tokenicon:изображение PNG или WebP, от 1 до 512 пикселей по каждой стороне, от 16 до 4 096 байт
Домены в реестре, например у шлюзаот 1 до 256 символов: буквы, цифры, точки и дефисы
URL в реестре, например у шлюзаначинаются с https://; без пробельных и управляющих символов, кавычек, угловых скобок и обратного апострофа
значения наборов данных inv:объект JSON без единого отрицательного числа

Всё остальное — произвольные байты по замыслу. Даже проверенное поле — это лишь форма: правильно составленный адрес https:// всё равно может вести куда угодно.

Иконки токенов

Узел отдаёт иконку каждого токена по адресу GET /api/v1/tokens/:id/icon с заголовками, которые делают её инертной: X-Content-Type-Options: nosniff, Content-Disposition: inline, Content-Security-Policy: default-src 'none'; sandbox и пятиминутный кеш. Странице не нужно ничего, кроме тега изображения, указывающего на этот маршрут.

Строки наборов данных: проверяйте сеттера

Список наборов данных узла для аккаунта возвращает строки, в которых этот аккаунт — сеттер или получатель, а любой аккаунт может записать строку под любым другим (наборы данных). Чтобы прочитать, что аккаунт говорит о себе сам, оставляйте только строки, чья role — setter или both; строку, где он только получатель, записал кто-то другой. Чтобы проверить утверждение вроде «verified = yes», принимайте только строку, сеттер которой — аккаунт, которому вы доверяете.

Значения приходят в двух формах: value, экранированное, и value_b64, без потерь. В любом случае содержимое — это текст незнакомца, который нужно показывать через textContent, как и всё остальное.

Контрольный список

  • textContent, а не innerHTML, для каждой строки, прочитанной из цепочки.
  • Проверяйте схему URL, прежде чем переходить по нему, и никогда не выполняйте текст из цепочки как указание.
  • Доверяйте строке набора данных только от ожидаемого сеттера.
  • Показывайте иконки токенов через маршрут иконок.

См. также