Есть js скрипт игры, я решил вести статистику игр, счёт игрока, и рейтинг команд.
С запись результата игры в базу данных там все просто, по окончании игры js отправляет get запрос на php обработчик, тот пишет результат игры в бд из этого вытекает все остальное — рейтинг, статистика.
Меня интересует как предотвратить накрутку результатов игры, если это js игра и много чего видно в исходном коде страницы, куда посылается запрос и какие параметры используются.
Пока я предусмотрел только примитивную защиту от накрутки через массовую отправку запроса такую. При открытии страницы с игрой в базу пишется идентификатор игры и пользователя, по окончанию игры запрос с результатом, идентификатором игры и пользователя отправляется на обработчик, он проверяет вообще была ли ранее создана такая игра с таким пользователем, если да, и результата игры еще нет, то пишет результат игры.
Это то, до чего я смог пока додуматься.
Но полностью от манипуляций с результатами игр и статистикой это защитить не сможет.
Есть у кого идеи, что еще можно сделать при описанных исходных данных?
Не скажу, что тема насущная прямо, это просто проект пока, скорее просто экзерсисы.
Нет весь игровой процесс сразу выполняется на стороне клиента, в окончании игры есть алерт на который я и повесил передачу данных на сервер.а в процессе игры отправлять промежуточные запросы?.. Есть возможность?
Вариант с обработкой каждого хода конечно тоже можно рассматривать, но мне кажется если речь не идет о взаимодействии между двумя игроками то нет смысла и накладно.
спасибо интересно.Вот неплохо разжёвано
особенно про дурачить читера понравилось, пусть наслаждается величием в своё маленьком мирке
Но мне кажется в этом случае, можно найти какое то радикальное решение отсекающее все варианты. Всё гениальное — просто. Но я найти его не могу) пока
Пока только один вариант, если игра доступна только в андроид приложении и не доступна через браузер. Правильно ли я понимаю, что в этом случае, игра защищена?
Как пример урл реферера, или другой ключ имеющийся на странице игры,
Не понятно.Если игра не браузерная, то о чём речь вообще? Где юзер будет видеть исходный код?Пока только один вариант, если игра доступна только в андроид приложении и не доступна через браузер. Правильно ли я понимаю, что в этом случае, игра защищена?
Ну я предполагаю что в этом случае нельзя видеть исходный код, но возможно я не знаю каких то вариантов, поэтому уточняю.Где юзер будет видеть исходный код?
А вот заюзать uglifier — даже не смотря на открытый код, никто, даже гик, в этом г копаться не будет.
Для этого:
— обфусцировать JS-код;
— обфусцировать имена backend-скриптов (т.е. запрос слать не на /save-score.php?score=123, а на /ph12.php?qq=123). Тут можно изголяться и, например, слать вообще не число, а делить результат на разряды и слать символ с нужным ASCII-кодом для каждого разряда. Будет выглядеть как /ph.12.php?qq=A#Hf5
— передавать не результат в открытом виде, а его некий хэш, например просто XOR-ить счет (для поиска этой логики нужно будет разбираться с обфусцированным кодом, что в общем никому не нужно).
Пример:
var xoredScore = score ^ key;
$score = $xoredScore ^ $key
— по возможности, передавать не конечный результат, а данные для его вычисления (например, для тетриса это мог бы быть массив с количеством одновременно сброшенных линий в каждый момент времени). Конечный же результат вычислять уже на сервере.
Если же все-таки хочется 100% защиты, то здесь только один вариант:
— уносить логику на сервер, используя JS только как "тупой терминал", показывающий данные с сервера