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

Предотвращение подстройки/взлома javascript-игр

Благодаря усовершенствованиям последних браузеров, разработка игр с холстом и javascript стала хорошим вариантом, но теперь, когда код легко доступен, просто пишите

javascript:score=99999

или

javascript:lives=99

Портит игровые цели.

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

Интересно, по крайней мере, для того, чтобы начать с.

(используя не столь очевидные имена переменных, это начало, но недостаточно)

-Добавлена ​​-

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

4b9b3361

Ответ 1

Я скажу, что я сказал в своем комментарии: поставьте каждый исходный код в (function(){ }());. Затем переменные и функции не могут быть доступны извне.

Пример:

(function(){
    var a = 'Foo';
    var b = 42;
    function helloWorld(a,b){
        for(i=0;i<b;i++)console.log(a);
    }
    helloWorld(a,b);
});
//Can't access to a, b, or helloWorld using javascript: or default console of Google Chrome,
//but people still can see by looking source code and may be modified by other tools
//(see comments of Tom & user120242)

Я научился этому методу, когда я копаюсь в Les Paul Google Doodle.

Чтобы быть более безопасным (не полностью безопасным, но это будет раздражать некоторых хакеров), сжимать и обфускать ваш script инструментами вроде YUI compressor или packer.

Ответ 2

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

Это легко для игр, таких как пасьянс или шахматы, но не для более сложных игр.

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

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

Offline игры могут быть помечены в таблице рекордов или что-то, чтобы показать, что они не подтверждены.

Стоит отметить, что с любым отладчиком javascript, таким как Inspector in Webkit, Firebug для Firefox или Dragonfly on Opera, тривиально изменять значение переменных на стороне клиента, даже если ваш код находится в закрытии. Любая форма обфускации бессмысленна, так как снова легко наблюдать, какая переменная соответствует счету в игре, и любая кодировка или что-то другое может быть просто прочитано из кода.

Ответ 3

В порядке предпочтения:

  • Отправка движений игроков или статистика на сервер. Предотвратите странное поведение. например: слишком высокая оценка, недействительные действия, действия, которые невозможно воспроизвести, и т.д.
  • Предотвращение странного поведения на стороне клиента. То же, что и выше, но не на сервере. например: внезапные изменения жизни, слишком быстрое перемещение и т.д.
  • Создайте обфускацию JS-вывода (что вы должны делать, чтобы уменьшить размер JS в любом случае), например: GWT (компилятор Java-JS), компилятор Google Closure (ADVANCED_OPTIMIZATIONS будет запутывать больше, --output-wrapper (function() {% output %})() для закрытия в закрытии), Yahoo Compressor
  • Обнулить значения переменных, например: Кодировать строки (xor, подстановка, BASE64), не использовать обычные приращения переменной
  • Используйте закрытие для инкапсуляции имен переменных: (function() {code here})()

EDIT: Я хочу пояснить, что лучшим решением по-прежнему является перенос расчетов на сервер, как сказал Rich Bradshaw. Эти вещи могут делать только так много, даже после того, как вы запутываете код.

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

Самая важная идея, которую нужно получить из этой ссылки:

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

Ответ 4

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

EDIT:
У меня есть другая идея: вы можете зашифровать свой код с помощью серверной части script с использованием асимметричного шифрования (например, RSA), а во время выполнения ваш код может запросить ключ дешифрования с сервера и работает на этом. Все еще не идеально, но лучше, чем BASE64.