Задать вопрос

Защита от читеров в клиент-серверной игре

Разрабатываю простую игру с клиентами для браузера и мобильных телефонов и серверной части. Пользователи будут проходить квесты и получать за это какие-то бонусы, которые затем через обычный HTTP GET/POST будут передаваться на сервер.

Интересуют способы о том, как защититься от читерства. в Q&A был один похожий вопрос и пару статей на хабре, но всё же не совсем то.

Есть ли смысл шифровать все запросы или хватит только подписи? Как подписывать: прошивать ключ в клиенты или же генерировать для каждого пользователя индивидуальный и передавать его при логине? В первом случае его можно достать путём анализа бинарника, во втором случае просто перехватить сниффером и подписывать самому все запросы. Какие еще варианты есть? Что почитать на эту тему?
  • Вопрос задан
  • 3763 просмотра
Подписаться 12 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 5
@rPman
Универсальный механизм — обфускация кода на клиентской стороне и хоть какое-нибудь шифрование трафика. Это не прикроет возможность читерства, но сделает его сложнее/дороже.

p.s. личное нохау, попробуйте периодически вместе с обфускацией постоянно изменять алгоритмы шифрования, меняйте все что возможно, формат структур критичных ко взлому (игровых) данных. Подкидывайте в код обманки, делайте в коде специальные ошибки (например функцию назвали md5, но в ее коде сделайте несколько изменений). В общем максимально усложняйте жизнь тем кто будет декомпилировать и изучать ваш код.

Универсальная, что-либо гарантирующая альтернатива, — перенести всю или часть обработки логики игры на сервер. Основной недостаток — серьезные повышения требования к сети (чаще невыполнимые для мобильных устройств) и, иногда, повышение нагрузки на сервер.

p.s. p2p связь возможна? перенесите часть обработки (проверки валидности/реальности событий управления персонажами) на соседнего клиента (ближайшего с точки зрения сети) — это поможет частично разгрузить сервера.

В любом случае защититься от автоматизаторов действий все равно будет нереально, ведь можно изучать изображение на скрине и имитировать нажатия на кнопок. От этого можно спастись только вменяемой игровой логикой, не требующей от игроков тупых монотонных действий…
Ответ написан
@korvindest
Многое сказал rPman, но я как человек выполнявший функции «читера» по просьбе разработчиков одной игры, попробую систематизировать.

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

2. Операции с покупками продажами и всяким расходованием ресурсов необходимо делать атомарными (единовременное списание и появление покупки/постройки/хзЧего), иначе можно зафорсить кучу зданий или юнитов, пока средства не списаны.

3. Все нововведения в уже появившуюся игру следует поначалу более подробно логировать.
Как правило самые гнусные читы находятся именно в новых возможностях игры.

4. Создать функцию, которая по каким то вам одному ведомым империческим параметрам характерезует суммарную скорость роста игрока за период и следить внимательно за лидерами.

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

6. Все действия игрока следует сопровождать идентификатором сессии(Я понимаю, что тут я КЭП, но все же), который стоит периодически подменять, не требуя повторной авторизации, если использование более старого идентификатора было не так давно.

7. Написать набор функций проверяющих наличия в базе нереальных значений. Например: в доме где максимум жильцов составляет 10 человек живет уже 236. Или суммарные затраты на содержание электростанции составляют -135 валюты. Это так же позволит обнаруживать особо наглых читеров.

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

Ну а вопрос шифрования оставлю на людей, более компетентных в этом вопросе.
Ответ написан
@AlpenColt
Не забудьте про ботоводов. На dtf.ru была не плохая статья на эту тему. Вообще, рекомендую полазить по данному ресурсу, т.к. можно много интересной информации накопать.

Ещё хотел бы добавить, что чистое шифрование не поможет, об этом упомянул вскользь korvindest, но я уточню. Даже не расшифровывая сам запрос, мы может понять что при отправке пакета X на сервер происходят определённые действия. И этим легко воспользоваться при любой автоматизации действия, в то числе и при читерстве. Поэтому в данные нужно подмешивать некоторые уникальные IDшники, которые будут постоянно обновляются.
Ответ написан
enkryptor
@enkryptor
software developer (TS/JS, python, C#)
Пожалуйста, уточните условие «Пользователи будут проходить квесты и получать за это какие-то бонусы, которые затем через обычный HTTP GET/POST будут передаваться на сервер». Кто будет передаваться? Бонусы?

Если квесты проходятся локально на клиенте, а через HTTP посылается готовый результат — то как ни защищайся, читы не предотвратишь (слишком много векторов атаки, возможна не только подделка трафика, но и вмешательство в работу самой игры). Если же прохождение квестов отслеживается со стороны сервера, а через HTTP игроку даётся лишь конечный интерфейс — то и читерить не получится.
Ответ написан
vasmant
@vasmant
Adblock Plus Android есть возможность фильтровать трафик
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы