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

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

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

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


person Tom    schedule 09.01.2020    source источник
comment
При создании хеша сохраните его в константе, во время игрового цикла получите хэш текущего пользователя и сравните его с сохраненным значением. В качестве альтернативы вы можете создать словарь/объект для отслеживания пользователей с их связанным хешем.   -  person Ali Beyit    schedule 09.01.2020
comment
Спасибо! Мой вопрос в том, как создать хэш из всех классов JS. Я отправляю ХЭШ в серверную часть игры, и там мы можем видеть, есть ли у некоторых пользователей другой хеш, чем у других.   -  person Tom    schedule 09.01.2020
comment
Поскольку опытный пользователь может просто запустить XHR-вызов вашей службы оценки без каких-либо изменений в коде, это может быть не очень надежной защитой, как вы думаете. И это намного проще, чем модифицировать (может быть, уменьшенный) исходный код игры.   -  person Mosè Raguzzini    schedule 09.01.2020
comment
Хорошо, что связь с серверной частью защищена, а связь в реальном времени не позволяет пользователю отправлять звонки. Идея состоит в том, чтобы запретить пользователю создавать свой собственный клиент.   -  person Tom    schedule 09.01.2020


Ответы (1)


Как сказано в моем комментарии, хеширование вашего источника не является эффективным средством защиты от взлома.

Самый надежный способ предотвратить мошенничество — запустить свой движок на стороне сервера и проверять каждое действие с помощью стратегии прогнозирующий клиент/авторитетный сервер.

Прогнозирующий клиент

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

Авторитетный сервер

Сервер, получив оценку и дополнительную информацию, может выполнить проверку этих данных, например:

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

После проверки на стороне сервера вы можете согласовать состояние игры или аннулировать игру с помощью токена после ее завершения.

person Mosè Raguzzini    schedule 09.01.2020
comment
Это хороший ответ, но я ищу что-то вроде решения crc32 (document.body), где crc32 stackoverflow.com/questions/ 18638900/javascript-crc32 - person Tom; 09.01.2020
comment
@Tom, это не эффективное решение; Я могу (например) сохранить ваш хэш, изменить код по своему усмотрению, а затем повторно отправить сохраненный хеш без проблем, переопределив функцию, которая его вычисляет. Если я достаточно умен, чтобы модифицировать игровой движок, я точно смогу это сделать. ИМХО, вы можете препятствовать мошенничеству, модифицируя свой движок, смешивая некоторые методы с минимальными усилиями: минимизируя его, используя Object.freeze() и добавляя некоторую проверку на стороне сервера. Предотвращение мошенничества на 100 % требует решения (решение, используемое платформами онлайн-гемблинга вместе с блокчейнами и другими технологиями) - person Mosè Raguzzini; 09.01.2020