Это классическая проблема с интернет-играми и конкурсами. Ваш Flash-код работает с пользователями, чтобы решить счет для игры. Но пользователям не доверяют, и код Flash выполняется на компьютере пользователя. Ты SOL. Вы ничего не можете сделать, чтобы не дать злоумышленнику подделать высокие баллы:
Обратиться к Flash проще, чем вы думаете, поскольку байт-коды хорошо документированы и описывают язык высокого уровня (Actionscript) - когда вы публикуете игру Flash, вы публикуете свой исходный код, независимо от того, знать это или нет.
Злоумышленники контролируют оперативную память интерпретатора Flash, поэтому любой, кто знает, как использовать программируемый отладчик, может в любое время изменить любую переменную (включая текущий счет) или изменить саму программу.
Самая простая атака на вашу систему - запустить HTTP-трафик для игры через прокси-сервер, поймать сохранение с высоким счетом и воспроизвести его с более высоким счетом.
Вы можете попытаться заблокировать эту атаку, привязав каждое сохранение рекордов к одному экземпляру игры, например, отправив зашифрованный токен клиенту при запуске игры, который может выглядеть следующим образом:
hex-encoding( AES(secret-key-stored-only-on-server, timestamp, user-id, random-number))
(Вы также можете использовать сессионный cookie для того же эффекта).
Код игры возвращает этот токен на сервер с сохранением рекордов. Но злоумышленник все еще может просто запустить игру снова, получить токен, а затем сразу же вставить этот токен в повторное сохранение высокого результата.
Итак, затем вы вводите не только токен или сессионный 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 является злой.
Вот некоторые вещи, которые действительно могут уменьшить мошенничество с высокими показателями:
Для входа в игру требуется логин, чтобы логин генерировал сессионный куки-файл, и чтобы не допускались многократные запуски игр в одном сеансе или несколько одновременных сеансов для одного и того же пользователя.
Отклоните высокие оценки от игровых сессий, которые длятся меньше, чем самые короткие реальные игры, в которые когда-либо играли (для более сложного подхода, попробуйте "изолировать" высокие оценки для игровых сессий, которые длятся менее чем на 2 стандартных отклонения ниже средней продолжительности игры). Убедитесь, что вы отслеживаете продолжительность игры на сервере.
Отклонить или изолировать высокие оценки от логинов, которые играли в игру только один или два раза, так что злоумышленники должны составить «бумажный след» разумного вида игры для каждого логина, который они создают.
«Сердцебиение» набирает очки во время игры, поэтому ваш сервер видит рост очков за время одного игрового процесса. Отклонить высокие баллы, которые не соответствуют разумным кривым баллов (например, прыжки от 0 до 999999).
«Снимок» игрового состояния во время игры (например, количество боеприпасов, положение на уровне и т. Д.), Которые вы позднее можете согласовать с записанными промежуточными результатами. Вам даже не нужно иметь способ обнаруживать аномалии в этих данных, чтобы начать с; вам просто нужно собрать его, а затем вы можете вернуться и проанализировать его, если все выглядит подозрительно.
Отключите учетную запись любого пользователя, который не прошел ни одну из ваших проверок безопасности (например, отправив зашифрованный высокий балл, который не прошел проверку).
Однако помните, что вы только сдерживаете мошенничество с высокими показателями здесь. Там нет ничего вы можете сделать , чтобы предотвратить , если. Если в вашей игре есть деньги на линии, кто-то собирается победить любую систему, которую вы придумали. Цель не остановить эту атаку; это сделать атаку более дорогой, чем просто получить действительно хорошую игру и победить ее.