3 November 2015

Защита in-App Purchase iOS от ломалок с помощю сервера

JavaDevelopment for iOS
Sandbox
Сегодня расскажу о том, как защитить in-app purchases в играх на мобильной платформе iOS с помощью собственного сервера. Практически все компании, которые выпускают свой продукт, заботятся о защищенности своих приложений и как можно больше пытаются защитить их от взлома. Одной из таких компаний является и та, в которой я работаю.

На данный момент на территории Испании проходит софтланч нашей игры. Сам я server-side developer и на мое плечо программиста легла проверка in-app purchases в игре, которую наша компания разрабатывала.

Все покупки в игре подтверждаются моим сервером. Происходит это следующим образом. Пользователь покупает в игре нашу валюту, тогда на смартфон от apple purchase server приходит json со всеми данными о покупке. После этого этот json попадает уже на наш сервер, сверяются некоторые поля и отправляются на apple verefication server, чтобы посмотреть, все ли хорошо. Если все в порядке, то от apple приходит json в котором есть много информации о покупке. Как утверждает документация на сайте Apple, нам достаточно проверить только поле status с присланного нам json. Если оно равно 0, то покупка правдивая и мы начисляем пользователю нашу валюту. Я ничего нового не придумывал и последовал этой документации.

В течение софтланча статистика нам показала, что один из пользователей купил нашей валюты в игре на 400 долларов. Однако мы не очень этому обрадовались, ведь видели, что эти покупки были с jailbreak смартфона. Посмотрев все данные, которые присылал девайс юзера нам на сервер, мы обнаружили, что они одинаковы. Немного поискав в интернете, мы натолкнулись на такую ​​штуку как LocallAPStore Cydia Tweak в jailbreak iOS. Работает она следующим образом. Когда пользователь делает in-app purchase в игре, то LocallAPStore перехватывает данные и заменяет на свои, и возвращает callback игре, что покупка выполнена, ну а дальше оно приходит нам на сервер, отправляется в Apple. Нам приходит от apple verefication server response status 0.

Поэтому чтобы не допустить этого прежде всего проверяйте поле original_transaction_id, оно является уникальным, если вы в своей базе данных найдете идентичное значение этого поля — то это фрод. Но этого иногда бывает недостаточно. Для полной проверки уже после того как вам придет response json от apple verefication server следует сверить поле bid с уже вашим bundle id, а также сверять поле product_id.

Надеюсь вам будет полезной эта информация. Жду от вас комментариев, пожеланий и замечаний.
Tags:in-app purchaseiOSvalidationcydiajailbreak
Hubs: Java Development for iOS
-2
8.5k 42
Comments 4