Предположим, что мы хотим залить на сайт vk.com какую-нибудь flash-казуалку и прикрутить к ней таблицу рекордов. Это довольно распространённая задача и в данной статье я рассмотрю различные подходы к её решению с точки зрения безопасности.
Для того, чтобы найти наиболее надёжный метод, я выбрал несколько случайных приложений, соответствующих всем условиям задачи, и попробовал написать своё имя на первые места их таблиц рекордов в обход игрового процесса.
Для начала, я проанализировал все запросы от этих приложений при помощи программы Charles и разделил наиболее популярные подходы на две категории в зависимости от того, где хранятся рекорды — на сервере ВКонтакте либо на своём собственном. Для того, чтобы определить, к какой категории относится конкретное приложение, достаточно посмотреть на то, какой сервер вернёт нам список рекордсменов при открытии таблицы рекордов или при запуске приложения.
Хранение рекордов на сервере ВКонтакте
Для защиты запросов к ВКонтакте API используется ключ sig, который генерируется на основе viewer_id, всех передаваемых параметров (кроме sid), а также ключа secret. Кроме того, каждый запрос должен содержать sid — идентификатор сессии.
Такая схема позволяет избегать подмены данных в запросах. Например, не зная secret пользователя, а также его sid, мы не сможем выполнить запрос от его имени. Вот только для сохранения рекорда нам не нужно подменять viewer_id, а значит все необходимые параметры у нас есть (их мы можем найти в исходном коде страницы приложения).
Для того, чтобы не рассчитывать сигнатуру запроса вручную, я воспользовался приложением тестовое приложение.
Ниже — подделка запросов на сохранение рекорда на примере трёх приложений:
Мега-шарик — аркада с необычным геймплеем:
Хранение рекордов на собственном сервере
Все запросы, идущие к вашему серверу также могут быть подделаны.
В качестве демонстрации я вновь воспользовался программой Charles и подменил запрос на сохранение рекорда в приложении Пушкин:
Выходит, нам нужно как-то защитить данные от подмены. Например, можно добавлять ко всем запросам какой-нибудь хеш, который генерировался бы на основании всех передаваемых значений, а также одного секретного, который отсутствовал бы в запросе. Этот хеш можно будет пересчитывать на сервере и отклонять запрос в случае несовпадения переданного значения с рассчитанным.
Рассмотрим такую систему на примере приложения Пчелиная атака — игра для друзей.
Я скачал файл приложения на свой ПК и открыл его при помощи программы Sothink SWF Decompiler.
На основе исходного кода приложения я написал небольшую программку, которая рассчитывает все ключи и отправляет запрос на сервер.
Я бы не смог этого сделать, если бы файл приложения был пропущен через обфускатор (например, secureSWF).
Заключение
Как вы могли убедиться, хранить таблицы рекордов на сервере ВКонтакте в любом случае небезопасно, а если вы пользуетесь собственным сервером, то нужно самостоятельно организовывать защиту хешированием, шифрованием запросов или любым другим способом. При этом файл приложения обязательно должен быть пропущен через обфускатор, иначе любой желающий сможет ознакомиться с кодом формирования сигнатуры и воспроизвести его.
Автор: Dolgofor