Це класична проблема Інтернет-ігор та конкурсів. Ваш Flash-код працює з користувачами, щоб визначити бал за гру. Але користувачам не довіряють, і Flash-код працює на комп'ютері користувача. Ти СОЛ. Ви нічого не можете зробити, щоб зловмисник не підробив високі бали:
Flash інженеру навіть легше, ніж ви могли б подумати, оскільки байт-коди добре задокументовані та описують мову високого рівня (Actioncript) --- коли ви публікуєте гру 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).
Стан гри «Знімок» під час гри (наприклад, кількість боєприпасів, положення у рівні тощо), яке ви згодом зможете погодити із записаними проміжними оцінками. Вам навіть не потрібно мати спосіб виявити аномалії в цих даних для початку; вам просто потрібно зібрати його, і тоді ви можете повернутися назад і проаналізувати, чи все виглядає рибним.
Вимкніть обліковий запис будь-якого користувача, який не здійснив один із ваших перевірок безпеки (наприклад, коли-небудь надсилаючи зашифрований високий бал, який не може перевірити)
Пам’ятайте, що ви тут лише стримуєте шахрайство з високими показниками Там немає нічого ви можете зробити , щоб запобігти , якщо. Якщо у вашій грі є гроші, хтось збирається перемогти будь-яку систему, яку ви придумали. Мета - не зупинити цю атаку; це зробити атаку дорожчою, ніж просто стати дійсно хорошим у грі та обіграти її.