Короткий ответ: перед подписью Sign-In with Ethereum (SIWE) проверьте, какой сайт просит вход, какой адрес кошелька и Chain ID указаны, что говорится в тексте, совпадает ли URI с текущей страницей, а также выглядят ли nonce и время действия нормальными. SIWE обычно подтверждает вход в сервис через сообщение, а не отправляет транзакцию и не переводит токены. Но подпись всё равно имеет значение для авторизации, поэтому не подтверждайте непонятный запрос.
Как устроено SIWE-сообщение
SIWE стандартизирует формат текстового сообщения, которое Ethereum-аккаунт подписывает для входа во внешний сервис. Сайт формирует сообщение, кошелёк показывает его пользователю, пользователь подписывает текст, после чего сервис проверяет подпись и поля запроса. В отличие от логина по паролю, сервис может связывать сессию с адресом кошелька. Подпись сообщения не равна транзакции: она сама по себе не включает onchain-вызов контракта, но может позволить сайту создать сессию от имени адреса.
Типичное SIWE-сообщение содержит домен, который просит войти, Ethereum-адрес, необязательное пояснение, URI, версию формата, Chain ID, nonce и время выпуска. Дополнительно могут встречаться срок истечения, время, до которого сообщение недействительно, идентификатор запроса и список ресурсов. Спецификация требует определённую структуру и связывает сессию с chain ID. Набор полей можно увидеть в кошельке как обычный текст или в структурированном представлении.
Не путайте SIWE с произвольным запросом «Sign message». В кошельке могут появляться и другие форматы подписи, включая EIP-712, который имеет отдельную типизированную структуру и может подтверждать условия приложения. Перед любой просьбой проверить текст можно по инструкции о подписи сообщений в кошельке, а особенности структурированной подписи разобраны в материале о проверке EIP-712.
Пошаговая проверка перед подписью
- Сверьте домен и источник запроса. Он должен совпадать с сайтом, где вы начали вход. Проверьте написание, поддомен и домен верхнего уровня. Если кошелёк показывает один сайт, а адресная строка другой, остановитесь. Запрос в iframe должен указывать origin самого iframe, а не только главной страницы.
- Проверьте адрес аккаунта. Убедитесь, что сообщение относится к выбранному адресу. Если вы подключили несколько аккаунтов, сайт не должен незаметно подменять выбранный адрес.
- Прочитайте statement. В нём должна быть понятная причина входа. Если вместо авторизации написано о передаче NFT, участии в airdrop, выдаче разрешения или переводе средств, это не соответствует простой просьбе войти.
- Сверьте URI и Chain ID. URI должен соответствовать сайту или ресурсу, для которого создаётся сессия. Chain ID показывает, к какой EVM-сети привязан вход и где сервис будет разрешать контрактные аккаунты. Не принимайте запрос на другой сети без понятного объяснения.
- Оцените nonce и время. Nonce – одноразовый случайный идентификатор, который помогает не допустить повторного использования старой подписи. Он должен выглядеть как случайное значение, а не как текст, пароль или секрет. Проверьте Issued At, Expiration Time и Not Before, если они есть; сообщение с неожиданным сроком или датой требует остановки.
- Проверьте Resources. Если список указан, прочитайте каждую ссылку или ресурс. Непонятный внешний домен, незнакомая цель подписи или расширенный набор разрешений могут означать, что сервис просит больше, чем обычный вход.
Не ориентируйтесь только на иконку сайта в кошельке. Она помогает распознать источник, но окончательное решение принимайте по содержимому запроса и текущему адресу страницы. Если текст обрезан, скрыт за свёрнутой панелью или отображается как неизвестные байты, не подписывайте его наугад.
Чем SIWE отличается от транзакции
При обычной SIWE-подписи кошелёк подписывает сообщение стандартного формата, а не транзакцию с вызовом контракта. У запроса на вход обычно нет суммы перевода, комиссии за gas и подтверждения размещения операции в блоке. Однако не стоит сводить оценку безопасности к одному этому признаку. Подпись может быть доказательством контроля над аккаунтом, а похищенная подпись для повторно используемого nonce способна помочь злоумышленнику обойти вход.
Транзакция обычно показывает сеть, действие контракта, сумму или данные вызова и после подтверждения отправляется в блокчейн. Для SIWE важны домен, текст и уникальность сессии. Если вместо текстового входа кошелёк показывает контрактный вызов, разрешение на расходование токена или перевод, это уже другой тип действия. Изучите поля, особенно если интерфейс предлагает подтвердить несколько запросов подряд.
Подпись сообщения тоже не нужно передавать поддержке или вводить на постороннем сайте. Она может содержать криптографическое доказательство, которое сервер использует для входа. Не копируйте signature, если не понимаете, кто её проверит и для какой сессии она выдана. Если вы уже подписали подозрительный запрос, закройте страницу, завершите неизвестные сессии сервиса и проверьте связанные разрешения и операции отдельно. Отключение соединения WalletConnect разбирается в статье о старых сессиях кошелька, но оно не аннулирует уже отправленную подпись на стороне сервера.
Что обеспечивает защиту от повторного использования
Один nonce на каждую сессию затрудняет повторную отправку перехваченной подписи. Сервер должен выдать или согласовать ожидаемое значение, сравнить его после подписания и пометить использованным. Наличие nonce в сообщении не защищает пользователя само по себе, если сервис принимает старые значения, не проверяет срок действия или не связывает подпись с правильным доменом и адресом.
Домен и схема запроса помогают кошельку сопоставить сообщение с origin страницы и распознать фишинговое окно. URI описывает ресурс, к которому относится запрос, а chain ID задаёт сеть. Пользовательская проверка должна сверить эти поля между собой: настоящий адрес сайта в браузере, домен в тексте и смысл входа должны совпадать. Сообщение с корректно выглядящим nonce всё равно может быть вредоносным, если подпись запрашивает похожий, но чужой домен.
К контрактным аккаунтам нужно относиться отдельно. Их подписи могут проверяться по правилам аккаунта в сети, указанной в Chain ID. Поэтому одинаковый адрес не всегда означает одинаковые права или одинаковый способ верификации на разных цепях. Не делайте вывод о владельце аккаунта только по тому, что текст подписан каким-то знакомым адресом.
Если сообщение выглядит подозрительно
Отклоните запрос и откройте официальный сайт вручную из закладки или проверенной ссылки, а не из рекламного объявления или личного сообщения. Не сообщайте кому-либо seed-фразу, приватный ключ, пароль, коды двухфакторной аутентификации или recovery-файл ради «проверки SIWE». Для поддержки достаточно описать домен и приложить скрин сообщения, предварительно скрыв личные сведения.
Если вы не можете определить назначение поля, попросите службу поддержки объяснить его через подтверждённый канал. Не подписывайте сообщение только потому, что сайт блокирует доступ или обещает награду. Пропуск полей вроде срока действия допустим спецификацией, но отсутствие ожидаемых мер защиты на незнакомом сервисе повышает риск повторного использования. Всегда рассматривайте конкретный запрос, а не только название стандарта.
Итог
Безопасный SIWE-вход можно проверить до подписи: домен и URI должны совпадать с сайтом, адрес кошелька и сеть – быть ожидаемыми, statement – описывать вход, nonce – относиться к новой сессии, а срок действия и ресурсы – быть понятными. SIWE не является переводом токенов, но подпись может открыть доступ к аккаунту. При несовпадении хотя бы одного существенного поля остановитесь и уточните запрос.



