Как защитить отправку результатов из игр HTML5 на мой сервер?

13

На бэкэнде я использую Java. У меня есть игра на HTML5; когда пользователь завершает его, я посылаю Ajax-вызов, чтобы сохранить счет в базе данных. Теперь кто-то может легко использовать такие инструменты, как Fiddler и firebug, чтобы изменить этот запрос ajax и отправить на сервер гораздо лучший результат. Как мне убедиться, что пользователь не может манипулировать счетами!

Дипак Сингхал
источник

Ответы:

18

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

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

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

MichaelHouse
источник
6
См. Programmers.stackexchange.com/questions/150127/… и gamedev.stackexchange.com/questions/37392/… чтобы завершить раздел «Никогда не доверяйте клиенту»
dievardump
@ Byte56 никакая форма обфускации или шифрования не защитит ваш код от отладчика, используемого для изменения игровых данных во время игры. Если игровой процесс происходит на клиенте, практически невозможно предотвратить эту форму мошенничества. Браузер с поддержкой Javascript не является доверенным вычислительным устройством.
MarkR
10

Как сказал Байт56: «никогда не доверяй клиенту», но:

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

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

есть средний путь.

Запись игр (на клиенте).
(В зависимости от типа игры это может быть очень просто (например, шахматы) или немного сложнее (например, многопользовательский FPS),
но это всегда выполнимо.)

Когда игрок заканчивает игру, просто отправьте счет.
Если счет находится в определенном диапазоне сверху (например, верхний 1% или верхний 5),
запросите записанные данные у игрока
и воспроизведите эту игру на сервере.
Если результаты совпадают, примите их.

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

Andreas
источник
2
Другими словами, кого это волнует, если они обманывают за что-то, кроме высших баллов (зачем они вообще так поступают?), Так что это единственные, которые вам нужно проверить.
Джоккинг
4

Не беспокойтесь об этом; Защита от всех атак практически невозможна, если вы доверяете клиенту. Если никто не использует Fiddler и т. Д., Чтобы изменить запрос AJAX, они могут просто запустить JS-отладчик и изменить данные игры, чтобы получить 1000 жизней и т. Д., Или изменить ваш код, или сделать 100 других вещей, о которых вы даже не думали.

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

MarkR
источник
4

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

Проверьте на сервере. Джоэл Полони хорошо описал приемы в Game Developer 2012, сентябрь "Scale Your Online Game"

Винсент Шейб
источник
2

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

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

Philipp
источник
Даже это не помешает всему мошенничеству - только очевидные вещи "да, я законно получил базилион очков". Так как что-то должно выполняться на клиенте, они в конечном итоге получают некоторый контроль. По крайней мере, любой клиент, в частности, веб-браузер, поддерживает сценарии.
cHao