Как предотвратить публикацию отчетов об ошибках в глобальных таблицах рекордов?

Браузер и мобильные игры обычно имеют глобальные таблицы рекордов. Для этих таблиц также часто встречаются оценки в размере 2,147,483,647, где люди выяснили вызов webservice, который сообщает о результатах и ​​использовал его для записи фиктивного балла.

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

Однако это быстро становится неосуществимым для чего-либо большего, чем Pac-man.

Как еще можно предотвратить обманы такого рода?

43 голоса | спросил teedyay 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 30 Sep 2010 17:26:55 +0400 2010, 17:26:55

10 ответов


9

Внутренняя система, которую мы использовали для Moblox (позже замененная OpenFeint), работала следующим образом:

  • Отправить JSON-сообщение через простой HTTP (не HTTPS). Включите MD5-хэш всех полей плюс волшебную строку.
  • На сервере проверьте целостность сообщения с той же операцией.

Чтобы взломать систему, вам нужно найти эту магическую строку. Это возможно с обратной инженерией, но болезненным.

OpenFeint, ScoreLoop и CocosLive используют один и тот же трюк, но с HTTPS. Очень легко реализовать.

ответил Ellis 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 30 Sep 2010 19:50:35 +0400 2010, 19:50:35
19

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

Например, в FPS каждую минуту вы можете спросить: «Сколько у вас убивает?», «Где все враги?» и т. д. Если клиент не вернется с разумным ответом на вызов в разумные сроки, они обманывают.

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

Я бы рекомендовал вам пересмотреть отправку повторов. Все, что вам действительно нужно, это начальное случайное семя и временный ввод. Это должно быть действительно несколько сотен КБ. Многие аркадные игры делают это уже для сохранения повторов для целей просмотра игроков; если ваш сервер проверяет их, это может быть не тривиально, но он предотвращает все виды обмана, кроме боттинга.

ответил 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 30 Sep 2010 23:13:44 +0400 2010, 23:13:44
10

Вы можете ограничить самые вопиющие нарушения, отслеживая самые высокие результаты в таблице верхнего балла. В зависимости от вашей игры у вас может быть «идеальный счет», выше которого любой балл должен быть мошенническим. Если нет, вы можете рассчитать самый низкий «невозможный балл»; может ли игрок снимать 10 выстрелов в секунду, игра длится 1 минуту, а каждый убитый враг стоит 100 очков? Тогда любой балл выше 60 000 должен быть мошенническим.

Вы также можете помочь устранить проблему, отправив некоторые метаданные; а не полную историю игр, как вы описываете, а только компоненты, составляющие счет. Скажите: оценка 60000, 500 убитых врагов, и один бонусный предмет схвачен. Затем вы можете выполнить простые проверки. Это «безопасность через неясность» и, следовательно, вообще не защищена, но помогает устранить самые наивные из нападавших.

ответил Gregory Avery-Weir 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 30 Sep 2010 18:59:53 +0400 2010, 18:59:53
6

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

В противном случае вам придется полагаться на методы обфускации (например, шифрование и отправку других статистических данных за пределы оценки).

Вы также можете отправлять баллы периодически по мере игры, что добавит еще один уровень сложности к обману, т. е. сервер может решить, была ли игра сыграна достаточно долго, чтобы гарантировать конкретный балл, а также обеспечить, чтобы в течение игрового времени было получено достаточно промежуточных отчетов (просто не делайте это на 100%, или поезд, идущий в туннель по дороге домой, приведет к тому, что я вытащу телефон из окна).

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

ответил JasonD 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 30 Sep 2010 19:32:26 +0400 2010, 19:32:26
6

Я добавил быстрый /грязный стол с высоким рейтингом в мой проект и не совсем разбираюсь в интернет-безопасности /и т. д., как оказалось, он испорчен. Удивительно, но с почти 1 200 000 записанных баллов у меня было всего 5 или 6 партий партий явно ошибочных оценок, достигающих вершины доски. Большинство баллов даже больше напоминало глюк в игре, чем настоящий «взлом».

Итак, я думаю, что важно: убедиться, что система подсчета очков вашей игры не герметична , или, по крайней мере, сделать действительно хорошую проверку выполнимости баллов; теперь, эта игра, о которой я говорю, была записью Ludum Dare 48hr, поэтому она не была самой стабильной в мире. Но в целом я думаю, что чаще всего случайный игрок обнаруживает /использует игровой сбой, чем если кто-то прямо «взломает» таблицу лидеров.

Тем не менее, я сейчас работаю над переписыванием этого проекта, и я собираюсь изо всех сил с запутыванием. Я не буду вдаваться в подробности, но в основном у меня есть все оценки, представляющие ключевое значение, основанное на наборе случайных значений и хеширования и магической строки, затем на любой счет, который проходит эту проверку и достаточно высок, чтобы сделать фактическое " Top X "должно пройти еще один раунд проверки (на этот раз с истекающим значением ключа, сгенерированным на сервере, и более тщательными технико-экономическими проверками).

Я бы также посоветовал использовать трассировщик пакетов какого-либо типа , чтобы проверить, какие вещи видны (изначально я делал гораздо более простое подтверждение, которое означало, что кто-то может использовать трассировщик пакетов, чтобы найти и дублировать HTTP-запрос загруженного счета, не зная магической строки или чего-либо (что означало, что вам сначала нужен был законный балл, но вы могли бы отправить дубликаты этой оценки столько, сколько захотите.)). Я использовал Wireshark для тестирования этого.

Да, это получилось немного длиннее, но, надеюсь, это помогает ...

ответил Riley Adams 1 +04002010-10-01T01:11:21+04:00312010bEurope/MoscowFri, 01 Oct 2010 01:11:21 +0400 2010, 01:11:21
3

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

ответил 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 30 Sep 2010 18:48:37 +0400 2010, 18:48:37
1

Speedruns в основном записывают каждое нажатие клавиши, и они записывают игру WHOLE. Итак, да, вы можете записать всю игру, это небезопасно. Любой другой способ сделать это можно взломать через обратную инженерию (я не могу этого достаточно подчеркнуть: вы не добавляете безопасность, добавляете неясность).

Тем не менее, даже если вы это сделаете, они могут фактически отправить ускорение. Вы не можете ничего сделать, чтобы этого не случилось.

ответил o0'. 1 +04002010-10-01T03:23:47+04:00312010bEurope/MoscowFri, 01 Oct 2010 03:23:47 +0400 2010, 03:23:47
1

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

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

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

ответил Ian Schreiber 5 +04002010-10-05T19:51:03+04:00312010bEurope/MoscowTue, 05 Oct 2010 19:51:03 +0400 2010, 19:51:03
1

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

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

Скажите, что в игре есть 8-кнопочный вход (1 пэд и 4 кнопки) и работает со скоростью 60 кадров в секунду. Один часовой вход игры может быть передан с 3.6KB без сжатия. У вашей сессии, вероятно, будет менее одного часа, и сжатие должно сильно сократиться, потому что человеческий вход имеет много избыточности.

Задача состоит в том, чтобы сделать игру детерминированной, воспроизводимой с записанного ввода и исполняемого файла на сервере.

ответил Vinicius Canaa 20 J000000Thursday17 2017, 01:27:02
0

Никогда не выполнял это раньше, но ...

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

Затем вы установили контрольные точки /критерии для своих оценок.

Например: Счет в размере более 20 000 не может прибыть в первые 20 секунд игры. Оценка, превышающая 250 000, не может быть получена без записи более 200 000.

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

Боковое преимущество: подумайте о всей полезной статистике игры, которую вы получите от этого. Кто-то мог бы заплатить за это хорошие деньги.

ответил Markus 16 Maypm11 2011, 19:44:46

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132