Как стать автором
Обновить

Интеграция и серверная валидация инаппов для стора Google Play — как защититься от читеров

Время на прочтение10 мин
Количество просмотров5.6K
Всего голосов 36: ↑34 и ↓2+35
Комментарии21

Комментарии 21

Онлайн-проекты рано или поздно сталкиваются со взломом внутреннего стора

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


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


Почему это именно так? Возьмите для примера абстрактный клиент банка.
Если бы банковские клиенты разрабатывали по тем же принципам, по которым делают юнити-игры, то данные о счёте и все транзакции проводились бы прямо на клиенте, а на сервер отправлялась информация о балансе пользователя. Ну и аналитика, конечно же.


Любое приложение, в котором принимаются деньги и есть взаимодействие между пользователями, должно разрабатываться как клиент-серверное приложение, а не как толстый клиент с нашлёпкой в виде сервера, который валидирует что-нибудь.


Эта история, что характерно, абсолютно типичная для юнити-игр, и в таких проектах онлайн составляющая полностью вывернута наизнанку. Управляющим звеном является клиент, и к нему накидываются куча костылей в виде ассетов, бесплатных и не очень, в бесконечных попытках остановить читеров. По большому счёту, никакого "взлома" и не происходит, просто система изначально спроектирована так, что клиент обладает безграничными возможностями.


Большинство проблем, приводящих к такого рода "взломам", просто невозможны, когда клиент всего лишь сообщает о намерении что-либо сделать на сервер, а не изменяет своё состояние самостоятельно.


Валидацию можно подделать путём использования MitM прокси, либо банально пропатчить приложение, чтобы проверка всегда была положительной. Да, от этого можно защититься разными методами, но пока вы доверяете клиенту, всегда будет возможность эксплуатировать уязвимости если не напрямую, то косвенно.

Прямо видно, как у вас подгорает именно от юнити-игр

И это логично. Главный риск для разраба не в том, что его игру зачитерят, а в том, что играть в нее будет только он, его родители и парочка самых преданных друзей.

Поэтому, логично, что лучше сделать 10 игр без защиты вообще, и, когда одна взлетит и ее начнут читерить, то тушить пожар, чем все это время делать одну, но по стандартам финансовых приложений, и потом остаться ни с чем, когда окажется, что она не взлетела

Поэтому, логично, что лучше сделать 10 игр без защиты вообще

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


До какой-то степени справедливо для однопользовательских игр с минимальным взаимодействием игроков: возможность поглядеть на внешность/прогресс другого игрока, рейтинги и т.д.
В этом случае можно внутренние изменения проводить невидимо для пользователя.


Но если вы делаете PvP игру и изначально не проектируете архитектуру определённым образом, то когда она взлетит, вы не сможете быстро и незаметно переписывать приложение, поэтому это приведёт сначала к попытке прикрыть отдельные дыры костылями, потому что так дешевле, а потом либо к переписыванию кода, который уже оброс костылями, если к этому времени проект не умер


А если все 10 игр — это PvP игры, то какой-то костяк для них можно написать один раз и переиспользовать

У банков другие бюджеты и прибыль, они не могут проверять прототипы своих приложений про деньги на живой аудитории в софт-лонче. Геймдев все-таки про другое. На прототипах проверяется жизнеспособность идей: он вообще может эволюционировать в другую игру или внезапно выстрелить, когда команда разработки к этому не особо готова.

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

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

Когда в 2013 мы создавали Pixel Gun 3D, у нас была похожая ситуация. Атмосфера стартапа: экспертиза на тот момент было ограничена, а ресурсов и времени хватало только на разработку геймплейных фич. О безопасности некогда было думать, да и проблема читеров остро не стояла. Когда проект вырос и начались взломы, то переделать всю архитектуру, не навредив пользовательскому опыту, оказалось той еще задачкой. Такие изменения на огромной активной аудитории могут привести к гораздо более худшим последствиям, чем читеры.

Если валидация проходит неуспешно — потребляем (Consume) продукт без начисления пользователю.

Плохой пользовательский опыт. Покупку нужно начислять ДО отправки на сервак. Отнимать только в случае, если валидация не прошла. Нормальным игрокам это даст более приятный юзер экспириенс, а на читеров, в целом, по барабану.

на читеров, в целом, по барабану

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

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

В конечном счёте, это означает потерю дохода, т.к. в долговременной перспективе игроки, которые в игре задержались, и являются основным источником дохода.

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

В pvp играх такой проблемы быть не может (не должно), т. к. синхронизация состояний полностью идёт через сервер. Если в pvp игре такая проблема присутствует, то это концептуальная проблема игры на фундаментальном уровне, а не реализации покупок.

Я именно об этом и писал выше.

В статье говорится, что сервер только валидирует покупку, а начисляется и "потребляется" на клиенте, причём ответ с ошибкой все равно считается успешным.

Это возможно только в том случае, если сервер не управляет состоянием игрока, иначе в случае ошибки невозможно было бы "использовать" то, чего нет в наличии

А учитывая то, что ЦА это мобильного PvP шутера, скорее всего, школьники (не в плохом смысле, им просто такие игры нравятся), у которых не может быть бесконечного кол-ва денег для покупок, они точно будут искать способы получить что-то бесплатно. Тем более, учитывая что Android в этом плане намного больше позволяет сделать

В PvP играх такие игроки портят пользовательский опыт всем, начиная преимуществом при непосредственно игровом взаимодействии

В PvP играх отсутствие такой критично необходимой вещи, как баланс, из-за влияющих на pvp-составляющую донат-итемов портит «пользовательский опыт всем преимуществом при непосредственно игровом взаимодействии». А каким образом получены подобные итемы — для игроков уже вторично. P2W PvP никому не интересно, ибо победа не выигрывается, а покупается.

Премиум-айтемы всё-таки вводятся с предварительным расчётом на некую внутреннюю аудиторию, ограничивая по кол-ву опыта и т.д. То есть, это изначально закладывается в баланс.

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

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

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

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

Разработчику — да, важно.
А игроку, когда его постоянно убивает другой игрок, увешанный донат-предметами как новогодняя ёлка, глубоко безразлично — разработчику ли он за это деньги занес за «законные читы» или анонимусу с форума. Впечатление у него останется одинаково плачевное (разве что существование «анонимуса с форума» дает возможность такому игроку «нагнуть донатного пацанчика», что на время повысит его вовлеченность, но крайне нежелательно для разработчика т.к распугает донатящих, пришедших за преимуществом).

PvP (при активном участии обоих игроков, а не как в мобильных гачах, когда отрядом противника рулит компьютер) априори несовместимо с донатом, влияющим на силу игрока т.к превращает игру из Player vs Player в Player vs Shop. Такое только в PvE не вызывает негативной реакции.

Хотя я не знаю, что у вас продается. Возможно там бустеры энергии для большего количества боёв в сутки или еще что-то похожее. Тогда да, читеры — зло, и займут весь рейтинг.

То есть, вы просто проигнорировали всё, что касается баланса, контроля объема предметов и т.д?


Повторюсь: в правильно спроектированной игре не будет такого, что "анонимус с форума" ломая apk позволит использовать донат-предметы. Это значит, что игроку не встретятся "донатные пацанчики" вне рамок, предусмотренных балансом.


Как минимум, количество таких игроков регулируется, банально, ценой на такие предметы. То есть, статистически, чем мощнее/дороже предмет, тем меньше вероятность встретить игрока с таким предметов. В таком случае не будет такого, что игрока постоянно убивает "донатный пацанчик". Кроме того, это всегда регулируется чисто геймплейными элементами вроде уровней и раздельных "лиг" для игроков разного уровня.


Тотальное доминирование таких "донатных пацанчиков" над остальными игроками точно так же не выгодно разработчикам, как оно неприятно игрокам по причинам, которые лежат на поверхности, если немного задуматься.


Это видно даже по играм вроде CS:GO, где нет донатных предметов, которые напрямую влияют на свойства игрока/оружия.

Если влияющих на баланс предметов нет — я свои вопросы снимаю и приношу извинения :)

Но если оно а-ля point blank с донатным оружием с повышенными характеристиками, а не а-ля CS:GO со скинами — то тут или f2p-игроки страдают от донатящих с завидной регулярностью на протяжении всего матча, или (если подбор кидает донатящих к таким же) — донатящие сильно реже донатя т.к не ощущают результата своих вложений (ибо с новой донатной пушкой не стали сильнее своих соперников, как ожидали).
Так все и происходит. У нас есть два обращения к серверу, поясню.

Первое — сама валидация. После оплаты через интерфейс Google Play мы отправляем покупку на валидацию, в процессе которой сервер сохраняет у себя данные о результате и отправляет ответ клиенту. Игроку либо начисляется покупка, либо не начисляется (продукт в любом случае потребляется). В этот момент игрок уже видит начисление предметов в интерфейсе и может дальше играть.

Второе — отправка начисленного на сервер.

  • Если на сервере указано, что валидация прошла успешно, то сервер делает дополнительные проверки, что начисление соответствует купленному инаппу, и процесс покупки завершается.
  • Если на сервере указано, что валидация была неуспешной (но при этом клиент попытался отправить информацию о каких-то начисленных предметах), либо если проверки размера начисления провалены, то сервер переавторизует клиента со сбросом начисленных предметов. Это произойдет у читеров.

Но, как правило, включают в себя логику отправки данных на сервер валидации соответствующей платформы

В Одноклассниках нет, в Google Play тоже, по сути, нет, т. к. достаточно сигнатуру проверить.

Речь идет про валидацию на стороне клиента? Если да, то про «Одноклассники» не скажу, но все мобильные сторы (Google Play, App Store и другие) настоятельно рекомендуют проводить валидацию на стороне сервера, так как на стороне клиента это намного менее безопасно.

настоятельно рекомендуют проводить валидацию на стороне сервера, так как на стороне клиента это намного менее безопасно.

Я про проверку сигнатуры receipt'а на сервере вашим ключом. Как минимум, раньше этого было +- достаточно. Сейчас вижу, что рекомендуется посылать запрос к API Гугла.

незаконсьюмленные

Какое слово-то, таким и покрыть не стыдно
А ещё можно писать игрушки где покупаемые вещи не влияют на баланс и чисто красивости. Тогда и читерить с баблом такого смысла нет, а раз сами разрабы хотят меня поиметь то почему бы не поиметь их.
Увы, не популярная нынче позиция :(
На «узаконенных читах от разработчика» в «абсолютно бесплатных»​ играх можно собрать куда больше денег, чем на косметике.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий