Как защитить свое Mini приложение в Telegram?

Всем привет! Как насчет того чтоб перенять мой опыт?

Сегодня я хочу затронуть две темы, о одной из них мало информации в открытых источниках. Первое - это как я реализовал защиту в Telegram на REST API. Второе - это какие дыры есть в Mini App Telegram.

Вводные данные

Я разрабатываю Mini App в Telegram, это такая штука открывающаяся внутри бота и есть внутрение приложение Telegram.

Стояла задача разработать приложение с админкой, тратить время на развертывание сервера, налаживание и его защиту не было времени. Нужна оперативная работа.

Изучив возможные варианты, выбрал Strapi - это OpenSource проект написанный на Node.js. Развернуть можно как в облаке так и локально. Имеет поддержку русского языка.

Так выглядит админка Strapi
Так выглядит админка Strapi

Если в общем, то мой стек используемых инструментов выглядит следующим образом:

  • Telegram App ( Библиотека )
  • Strapi ( Админ панель + REST API )
  • PostgreSQL ( База данных )
  • Next.js ( Само приложение )
Стек технологий
Стек технологий

Решение с защитой что я предлагаю подойдет каждому. Главное понять его принцип.

Автор я сам

Как я защищал REST API? Валидация данных

Когда пользователь открывает веб-приложение через Telegram, ваше приложение получает начальные данные от самого Telegram, такие как идентификатор пользователя и его имя. Чтобы убедиться, что эти данные подлинные и не были изменены, используется специальный процесс проверки.

  1. Преобразование данных: Приложение преобразует начальные данные в удобный формат.
  2. Создание строки для проверки: Из всех параметров (кроме специального hash) создается отсортированная строка.
  3. Создание секретного ключа: С помощью токена вашего бота создается секретный ключ.
  4. Создание цифровой подписи: Используя секретный ключ и строку параметров, создается цифровая подпись.
  5. Сравнение подписей: Приложение сравнивает созданную подпись с полученной от Telegram. Если они совпадают, данные подлинные.
const validateInitData = (initData, botToken) => { const urlSearchParams = new URLSearchParams(initData); const data = Object.fromEntries(urlSearchParams.entries()); const checkString = Object.keys(data) .filter(key => key !== 'hash') .map(key => `${key}=${data[key]}`) .sort() .join('\n'); const secretKey = crypto.createHmac('sha256', 'WebAppData') .update(botToken) .digest(); const signature = crypto.createHmac('sha256', secretKey) .update(checkString) .digest('hex'); return data.hash === signature; }

Этот процесс помогает убедиться, что данные, полученные от Telegram, не были изменены, обеспечивая безопасность вашего приложения и его пользователей.

После успешной валидации я генерировал JWT токен для пользователя и он становился полноценным пользователем в моей системе.

Далее можно с ним делать что угодно 😏 - ну допустим заблокировать его, дать права админа и т.д.

А сам пользователь имеет полный доступ к возможностям приложения. Но вне телеграма он ничего не сделает.

Какие дыры есть в приложениях и почему?

Не буду показывать на конкретном примере, но большинство разработчиков не умеют или не хотят защищать свои приложения, а чисто привязывают все к Telegram ID ( ID вашего аккаунта ) и так и живут.

Telegram ID состоит из цифр и перебрать его методом подбора не составит труда и получить доступ к аккаунту в Mini App.

Зачастую этим грешат новые приложения или не опытные разработчики, например в Telegram Apps Store ваше приложение проверяют на наличие этой защиты.

Кроме того нужно учесть что само приложение не должно никоем образом отображаться в поисковиках, если все взаимодействие выстроено на основе телегерама. Приложения же имеют свой адрес и могут индексироваться, не забывайте выключать!

Кроме всего этого можно запретить вне телеграма заходить в ваше приложение тем же способом что описан выше.

Как же защитить приложение и пользователей?

Не важно на каком языке вы пишите, телеграм уже сделал для вас подсказку, осталось ей воспользоваться.

Оставлю ссылку здесь на данный раздел - Документация Telegram

Как защитить свое Mini приложение в Telegram?

Итого

Я надеюсь эта статья поможет тем кто хочет или уже занимается разработкой WebApp на Telegram. Если все еще осталось что-то не понятно, то пишите смело - будем вместе разбираться:)

Если у вас так же останутся вопросы или предложения или вы просто захотите поделиться своим приложением, то пишите! Всегда рад пообщаться с читателями 😁

3
Начать дискуссию