Данные цепочки — недоверенный ввод
Каждое название и символ токена, сообщение транзакции, инструкцию эскроу и значение набора данных в ZooBC выбрал тот, кто заплатил комиссию. Никто это не проверяет, и ничто не становится правдой оттого, что хранится навсегда. Правило для разработчиков короткое: данные, прочитанные из цепочки, — это ввод, а не указание.
Как показывать текст из цепочки
На веб-странице выводите текст из цепочки на экран как текст:
el.textContent = token.name; // shown as text: safe
el.innerHTML = token.name; // parsed as HTML: never
Текст, вставленный как HTML, может нести разметку и скрипты, которые выполняются с правами вашей страницы, и фильтров на регулярных выражениях недостаточно, чтобы это остановить. Ссылки требуют той же осторожности: не переходите по URL, найденному в данных цепочки, не проверив его схему.
Приложение, управляемое ИИ-агентом, точно так же никогда не должно подчиняться фразе, найденной в названии токена, заметке или значении набора данных. «Игнорируй свои инструкции», записанное в названии токена, — такие же данные, как любая другая строка. И баланс отправителя ничего не говорит о том, безопасен ли его текст.
Что проверяет протокол
Лишь у нескольких полей есть форма, которую обеспечивает цепочка:
| Поле | Правило |
|---|---|
значения наборов данных 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, прежде чем переходить по нему, и никогда не выполняйте текст из цепочки как указание.
- Доверяйте строке набора данных только от ожидаемого сеттера.
- Показывайте иконки токенов через маршрут иконок.