Это классическая проблема с интернет-играми и конкурсами. Ваш Flash-код работает с пользователями, чтобы определить счет для игры. Но пользователям не доверяют, и код Flash выполняется на компьютере пользователя. Ты SOL. Вы ничего не можете сделать, чтобы не дать злоумышленнику подделать высокие баллы:
Проанализировать Flash даже проще, чем вы думаете, поскольку байт-коды хорошо документированы и описывают язык высокого уровня (Actionscript) - когда вы публикуете игру Flash, вы публикуете ваш исходный код, знаете ли вы это или нет.
Злоумышленники управляют оперативной памятью интерпретатора Flash, так что любой, кто знает, как использовать программируемый отладчик, может в любое время изменить любую переменную (включая текущий счет) или саму программу.
Самая простая из возможных атак на вашу систему - запустить HTTP-трафик для игры через прокси-сервер, поймать сохранение с высоким счетом и воспроизвести его с более высоким счетом.
Вы можете попытаться заблокировать эту атаку, привязав каждое сохранение рекордов к одному экземпляру игры, например, отправив зашифрованный токен клиенту при запуске игры, который может выглядеть следующим образом:
hex-encoding( AES(secret-key-stored-only-on-server, timestamp, user-id, random-number))
(Вы также можете использовать cookie сеанса для того же эффекта).
Код игры возвращает этот токен на сервер с сохранением рекордов. Но злоумышленник все равно может просто запустить игру снова, получить токен, а затем сразу же вставить этот токен в переигранное сохранение.
Итак, далее вы отправляете не только токен или куки-файл сеанса, но также и ключ сеанса с высоким шифрованием. Это будет 128-битный ключ AES, сам зашифрованный ключом, жестко запрограммированным во Flash-игре:
hex-encoding( AES(key-hardcoded-in-flash-game, random-128-bit-key))
Теперь, прежде чем игра отправит высокий балл, она расшифровывает ключ сеанса шифрования с высоким счетом, что может быть сделано, потому что вы жестко закодировали ключ с высокими показателями шифрования ключа сеанса-дешифрования в двоичный файл Flash. Вы шифруете высокий балл с помощью этого расшифрованного ключа вместе с хешем SHA1 высокого балла:
hex-encoding( AES(random-128-bit-key-from-above, high-score, SHA1(high-score)))
PHP-код на сервере проверяет токен, чтобы убедиться, что запрос поступил от действительного игрового экземпляра, затем расшифровывает зашифрованный высокий балл, проверяя, чтобы высокий балл совпадал с SHA1 высокого балла (если вы пропустите этот шаг, расшифровка просто приведет к случайным, вероятно, очень высоким, высоким баллам).
Так что теперь злоумышленник декомпилирует ваш Flash-код и быстро находит код AES, который торчит, как больной большой палец, хотя даже если бы этого не произошло, он был бы обнаружен через 15 минут с помощью поиска в памяти и трассировщика ( «Я знаю, что моя оценка для этой игры составляет 666, поэтому давайте найдем 666 в памяти, а затем перехватим любую операцию, которая касается этого значения - о, смотрите, код шифрования с высокой оценкой!»). С помощью ключа сеанса злоумышленнику даже не нужно запускать код Flash; она берет маркер запуска игры и ключ сеанса и может отправить произвольный рекорд.
Теперь вы находитесь в том положении, когда большинство разработчиков просто сдаются - дайте или возьмите пару месяцев, чтобы связываться с злоумышленниками:
Скремблирование клавиш AES с операциями XOR
Замена байтовых массивов клавиш функциями, вычисляющими ключ
Разброс фальшивых ключей и высокий рейтинг сообщений по всему двоичному файлу.
В основном это пустая трата времени. Разумеется, SSL вам тоже не поможет; SSL не может защитить вас, когда одна из двух конечных точек SSL является злой.
Вот некоторые вещи, которые действительно могут снизить количество мошеннических действий:
Требуется логин, чтобы играть в игру, иметь логин, создающий сеансовый cookie, и не допускать многократных запусков игры в одном сеансе или нескольких одновременных сеансов для одного и того же пользователя.
Отклонить высокие оценки от игровых сессий, которые длятся меньше, чем самые короткие реальные игры, когда-либо играемые (для более изощренного подхода, попробуйте "изолировать" высокие оценки для игровых сессий, которые длятся менее чем на 2 стандартных отклонения ниже средней продолжительности игры) ). Убедитесь, что вы отслеживаете продолжительность игры на сервере.
Отклонять или помещать в карантин рекорды по логинам, которые играли в игру только один или два раза, так что злоумышленники должны составлять «бумажный след» разумного вида игры для каждого создаваемого ими логина.
Оценка "Heartbeat" во время игры, так что ваш сервер видит рост очков в течение одной игры. Отклонить высокие баллы, которые не соответствуют разумным кривым баллов (например, прыжки от 0 до 999999).
Состояние игры «Снимок» во время игры (например, количество боеприпасов, положение на уровне и т. Д.), Которое вы позднее можете согласовать с записанными промежуточными результатами. Вам даже не нужно иметь возможность обнаруживать аномалии в этих данных, чтобы начать с них; вам просто нужно собрать его, а затем вы можете вернуться и проанализировать его, если все выглядит подозрительно.
Отключите учетную запись любого пользователя, который не прошел ни одну из ваших проверок безопасности (например, когда-либо отправлял зашифрованный высокий балл, который не прошел проверку).
Помните, что вы только сдерживаете мошенничество с высокими показателями здесь. Вы не можете ничего предотвратить, если. Если в вашей игре есть деньги на линии, кто-то собирается победить любую систему, с которой вы столкнетесь. Цель не состоит в том, чтобы остановить эту атаку; это делает атаку дороже, чем просто хорошо играть в игру и обыгрывать ее.