Web-программистам про безопасность

Кира М. Кира М.

Дано: API ВКонтакте
Нужно: написать Flash-приложение, которое обращается к этому API, так, чтобы его было сложно взломать

Кто не знает, кратко опишу механизм:
1) На стороне сервера, когда мы устанавливаем приложение в ВКонтакте, мы задаём ему секретное слово Secret;
2) На стороне клиента, когда мы формируем запрос к серверу, слово Secret участвует в создании md5-суммы,
   которая также отправляется на сервер. Таким образом сервер якобы может проверить подлинность запроса.

Проблема лишь в том, что. Swf можно легко декомпилировать и узнать этот Secret.
Первое, что мне приходит в голову, это формировать md5-сумму на своём сервере (не ВКонтакте), где будет лежать и слово Secret.
А толку? Это лишь замедлит процесс взлома, но никак его не предотвратит.
Проанализировать трафик, узнать куда идёт запрос, и также обращаться к серверу за md5-суммой не составит труда.

Подскажите, как сделать приложение с приемлемой безопасностью. Я под сеть пишу первый раз.
Дополнено (1). > А общение с приложения с твоим сервером нужно для взлома аккаунтов?

Какой-то невнятный вопрос.
Общение приложения с моим сервером нужно для того, чтобы безопасно хранить данные о прогрессе игрока.
Дополнено (2). > апи в контакте позволяет хранить данные в своих переменных

Да это всё понятно. Вопрос не об этом.
Вопрос про то, как не дать посылать запросы API с идентификаторами приложения и пользователя вне приложения.
То что оно хранит в переменных, не исключает того, что в эти переменные можно извне запихать что угодно.
Дополнено (3). BlooDHounD, можно немного подробнее?
Просто не понятно, почему злоумышленник не сможет через мой сервер запросы посылать.
Пусть он не знает Secret, но у него есть доступ к сервису, через который осуществляется доступ.
Дополнено (4). BlooDHounD.
Не внимательно я читал документацию. Вроде, ясно теперь.
А данные об игроке соответственно хранить на своём сервере по auth_key, а не во внутренних переменных ВКонтакте?

А ещё не подскажете, как можно избежать накруток уже от владельца аккаунта?
То есть игрок себе может понаписать в характеристики, что угодно.
Или тут уж никак не уберечься?
Приходит в голову только отлов резких скачков значений переменных пользователя.

drpower drpower

А общение с приложения с твоим сервером нужно для взлома аккаунтов?

wizard wizard

Апи в контакте позволяет хранить данные в своих переменных -  лично я там и храню текущий рейтинг пользователя у мня пару игрушек есть в которые народ рубится -

Old Boyscout Old Boyscout

Если вы боитесь, что вас поламают, декомпилировав ваш свф, нужно вводить в md5 данные, которые не хранятся в свф, а только в памяти - например введенный пароль пользователя, я так понимаю ваша программа будет многопользовательской? Или же контакту нужен одинаковый md5 для любой копии запущенной вами программы?
Если же вы боитесь анализа трафика
> Проанализировать трафик, узнать куда идёт запрос, и также обращаться к серверу за md5-суммой не составит труда.
То вам нужно вводить шифровать весь ваш трафик с помощью какой-нибудь системі с открытым и закрытым ключем. Это как бы две разные проблемы немного.

archangel_546 archangel_546

Понятия Flash и "Безопасность" - несовместимы, в принципе!

BlooDHounD BlooDHounD

Кира М. Не храните secretKey на клиенте. На сервер отсылает только auth, который Вам передаёт контакт. Всё общение с контактом перенесите на сервер. Тогда Ваш secretKey, нигде не будет виден.

BlooDHounD BlooDHounD

А не сможет он отсылать запросы, так как ему надо авторизироваться.

auth_key = md5(api_id + '_' + viewer_id + '_' + api_secret)

api_id - это ид приложения.
viewer_id - это пользователь, который просматривает приложение.
А что бы авторизироваться ему либо надо знать secretKey, которой он не может знать.

В таком случаи действия злоумышленника ограничиваются логикой приложения.

BlooDHounD BlooDHounD

лучший ответ
Лучше хранить данные не по auth_key, а по viewer_id. Если механизм авторизации изменится, то Ваша база не потеряется.

Механизм такой:
1. Клиент посылает на сервер: viewer_id, auth_key.
2. Сервер знает app_id и api_secret. Берёт viewer_id и считает md5. Если полученный md5 совпадает с auth_key, то авторизация прошла успешно.

Что касается построения логики, тот тут целая куча вариантов и она зависит только от вашей фантазии. Можете создавать сессию, можете авторизовать при каждом запросе.

Механизмов валидации целая куча. Тут тоже всё зависит от вашей фантазии.

От ArtMoney можно уберечься только дублированием логики на сервере, или расчётом её прямо там. В общем тут целые книги пишут дядьки, я Вам тут вряд ли буду сейчас целые лекции писать.

Добавить комментарий | Похожие обсуждения

Вопросы и ответы по Вконтакте
Вопросы и ответы

Популярные вопросы и ответы о социальной сети www.vkontakte.ru (vk.com)