Подтвердить что ты не робот

Каковы наилучшие методы для составления онлайновых списков с высоким рейтингом в играх на основе JavaScript?

[Я знаю, что были схожие вопросы о предотвращении обмана в списках с высоким рейтингом, но ни один ответ мне не помог для игр на основе JavaScript, поэтому, пожалуйста, попробуйте подумать о моем вопросе, прежде чем рассказывать мне о подобных сообщениях. Я спрашиваю о best practices, потому что JavaScript всегда отображается для пользователя, и поэтому невозможно предотвратить обманывание полностью, я просто хочу сделать это сложнее.]

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

Отправка поддельных оценок в этот список будет довольно простой: можно взглянуть на запросы AJAX, а затем сделать собственный запрос AJAX с поддельным счетом. Использование чего-то типа token, которое должно быть отправлено с другими данными, бессмысленно, так как это будет легко обнаружить.

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

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

4b9b3361

Ответ 1

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

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

Однако есть некоторые методы, которые могут вам помочь:

  • включить подпись в ваш запрос. Что-то вроде MD5 (secret_key + params). Хотя "секретный ключ" должен быть в источнике JS, он эффективно защитит вас от простого перехвата запросов (см. Tamper Data и Charles)

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

  • вы можете установить кол-во очков, "недостижимый" результат. Каждый, кто публикует счет выше, чем обманщик. Например, скорость ввода текста: никто не может напечатать правильный текст при 1500 символов/минуту, даже 700 довольно тяжело (хотя и достижимо).

Ответ 2

Мне нравится играть в cheat the cheater - что-то вроде использования токена для аутентификации оценки, которая меняется каждый раз, когда вызывается обновление... но я принимаю оценку чита, которая отправляется с использованием дублированного токена. Затем я показываю этот чит-счет только мошеннику, так что кажется, что он сработал, но теперь мошенник видит свои результаты в песочнице.

Ответ 3

Оценка:

  • Запросить некоторый токен с сервера, это должно быть основано на времени и действует только около 2 секунд
  • Принимать только сообщения, содержащие действительный хэш этого токена, некоторую соль и оценку.

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

Хеширующая функция:

Сжатие хеширующей функции внутри упакованного кода (http://dean.edwards.name/packer/действительно создает неприятный код для чтения), если вы используете jQuery или какую-то другую библиотеку, просто отбрасываете хеширующую функциональность внутри файла библиотеки и получаете довольно сложно найти, особенно если вы используете имя функции, например "h":)

Обработка самой переменной счета:

Хорошо, что все с консолью отладки могут изменить переменную во время выполнения при этом, но если вы инкапсулируете весь свой Javascript внутри функции и называете ее, то нет ничего в глобальном пространстве имен, и гораздо труднее добраться до переменных:

(function() {
  //your js code here
})();

Ответ 4

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

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

p.s: И серьезно - любой ребенок с Firebug/WebInspector может легко взломать вашу JS-игру и, в конечном итоге, получить очень высокий балл.

Ответ 5

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

Есть два способа думать о

1.) "безопасность через неясность".

Придумайте алгоритм, который преобразует простые оценки во что-то другое (и преобразует их обратно). Затем обфускайте его. Успокойте это. Напишите функцию, которая умножает ее на q и делит ее на ralph. Примените к нему кучу функций, а среди 5-15 функций, которые делают для него случайные вещи, включают в себя тот, который умножает число на 19 (простое число). На вашем сервере убедитесь, что каждый входящий номер (или буква) делится на 19 и декодирует

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

2.) время

Вы должны знать, когда пользователь начал игру. Вы должны начать сеанс и записать, когда они запросили страницу. Затем вы также сможете сказать, когда они представили свой счет. И вы также должны знать, что такое временные ряды для максимальных точек. То есть вы можете получить 5 очков в минуту, 100 в минуту, минуту ^ 3 и т.д. Если пользователь отправляет больше очков, чем это возможно в течение этого времени, они обманывают.

Вы также можете установить баланс между обработкой сервера и клиента и заставить клиента отправлять обновление прогресса каждые x минут с помощью ajax. И если он не сообщает, вы предполагаете, что он был скомпрометирован (как в фильмах Бонда, когда он проникает в логово врага, и он фиксирует шею охранника. Когда охранник не отвечает на свою следующую 10-минутную регистрацию, тревоги будут отключены).

Если вы когда-либо играли в Zynga Poker, вы, вероятно, видели, что происходит, когда у кого-то за столом происходит медленное подключение к Интернету.

Ответ 6

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

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

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

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

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

Ответ 7

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

В качестве альтернативы вы можете вручную проверить журнал событий на действительно высокие баллы (общий верхний-X, который должен быть довольно стабильным).

Вам понадобится генератор случайных чисел с посевом, если вы делаете что-либо со случайностью (например, случайные события). Что может быть сложно, если вы еще не подумали об этом.


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

Многопользовательские решения безопасности для HTML5

http://lanyrd.com/2011/jsconf/sfggb/

Игры, такие как Starcraft, записывают только щелчки мышью и нажатия клавиш. Затем моделируются фактические команды. Я ожидаю, что "Worms Armageddon" сделает что-то подобное, но их случайные события (например, bounciness of bananas) не засеяны должным образом, поэтому в момент повторного воспроизведения вы можете получить другой результат.

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

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

Ответ 8

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

Ответ 9

Я использовал систему, использующую запрос по времени, имеющий 3 параметра

req number, curr time, score 

req number возвращается с сервера в ответ на запрос оценки обновления, каждый раз, когда это новое случайное значение.

Время в курсе рассчитывается не от компьютерных часов, а от начала игры и синхронизируется с сервером с использованием запроса ajax.

Запрос оценки обновления отправляется через короткие интервалы (максимум 30 секунд).

На сервере применяются следующие проверки.

Время находится в пределах 10 секунд от часов сервера.
прошло не более 40 секунд с момента отправки номера req.
возможно изменение счёта после 30 секунд (в пределах 2 х по-человечески возможному диапазону)

Оценка обновляется только в том случае, если вышеуказанные проверки переданы или пользователь получает сообщение об отключении: (

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

Ответ 10

Если не обманывание важнее самой игры, попробуйте построить и представить свою игру таким образом, чтобы она находила решение математической проблемы. Таким образом, сервер предоставит экземпляр проблемы клиенту (пример A: шахматная доска, которая должна быть выиграна в 3 ходах, пример B: случайный порог уровня геометрической тишины), и пользователю придется решить эту проблему и отправить обратно решение (пример A: выигрышные ходы, пример b: точные временные метки и интенсивность прыжков, чтобы избежать препятствий)

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

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

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

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

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