- PVSM.RU - https://www.pvsm.ru -
Не так давно шумели новости о активации in-app покупок бесплатно и даже без джейлбрейка. Идея проста, в систему устанавливаются ssl сертификаты и прописывается кастомный dns сервер, который запросы к серверам apple будет пересылать на сервер взломщиков. Сервер взломщиков будет подтверждать покупку и она успешно активируется на устройстве. После выхода этой новости паники было много и Apple даже пришлось что-то делать и рассказывать разработчикам, как защитить их приложение [1]. На самом деле проблема была не нова, на джейлбрейкнутых устройствах уже давно можно было активировать in-app покупки бесплатно. Решение проблемы так же не ново, оно описано в документации Apple, но практической реализацией никто себя не утруждал. О моей версии такой защиты и пойдет речь ниже.
Есть два возможных сценария. Простой:
Устройство активирует покупку через сервера apple без дополнительной валидации и участия сервера разработчика.
Сложный:
Сервер разработчика может участвовать в процессе покупки следующим образом:
Нас интересуют шаги 10-11, т.к. именно на них мы можем помочь устройству определить был чек выписан сервером apple или это подделка.
Валидировать чек покупки мы можем только на сервере Apple. Для этого надо отправить JSON с чеком закодированным в base64, внутри HTTP POST запроса:
{
"receipt-data" : "(receipt bytes here)"
}
На один из серверов Apple,.
В ответ сервер вернет статус валидации, и если валидация успешна, декодированные поля чека.
{
"status" : 0,
"receipt" : { (receipt here) }
}
Понимая описанную выше механику не составило труда написать приложение-прокси на ruby, которое пересылает запросы на валидацию на один из серверов Apple. Я выложил готовый к использованию код приложения на GitHub [4]. Буду рад улучшениям и pull-запросам. Также его можно потрогать на heroku: https://receiptValidator.heroku.com/validate [5], используя тестовый чек [6] из репозитория. С галочкой sandbox — можно посмотреть корректый ответ, а без неё — на код ошибки.
В приложении мы анализируем ответ нашего сервера и решаем стоит активировать встроенные функции или это подозрительный чек и его можно игнорировать. Если интересно в следующей статье я напишу о защите внутри приложения.
P.S. немного бессовестного самопиара: эта защита была написана специально для Galileo Offline Maps [8] и была успешно опробована в версии 2.2, которая появилась в AppStore [9] вчера утром.
Автор: mOlind
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/ruby/12214
Ссылки в тексте:
[1] рассказывать разработчикам, как защитить их приложение: http://developer.apple.com/library/ios/#releasenotes/StoreKit/IAP_ReceiptValidation/_index.html
[2] sandbox.itunes.apple.com/verifyReceipt: https://sandbox.itunes.apple.com/verifyReceipt
[3] buy.itunes.apple.com/verifyReceipt: https://buy.itunes.apple.com/verifyReceipt
[4] код приложения на GitHub: https://github.com/molind/receiptValidator
[5] https://receiptValidator.heroku.com/validate: http://receiptvalidator.heroku.com/validate
[6] тестовый чек: https://raw.github.com/molind/receiptValidator/master/receipt.txt
[7] хостинг: https://www.reg.ru/?rlink=reflink-717
[8] Galileo Offline Maps: http://galileo-app.com
[9] AppStore: http://itunes.apple.com/app/galileo-offline-maps/id321745474?mt=8
Нажмите здесь для печати.