Мы стремимся сделать Google Play безопасной платформой для пользователей и разработчиков. Мы понимаем, что для успешного развития бизнеса приложений необходима надежная платформа, которая защищает вашу рентабельность инвестиций, активно противодействуя злоумышленникам.
В этом документе приведены рекомендации, которые помогут вам предотвратить атаки на платежную систему и облегчить последствия махинаций в приложении.
Как улучшить защиту
Следующие API и инструменты помогут снизить риски в вашем приложении:
- Voided Purchases API – отзывать доступ к аннулированным заказам.
- Замаскированный идентификатор аккаунта. Помогает выявлять случаи, когда покупки в одном аккаунте совершаются с нескольких устройств за короткий промежуток времени.
- Использование на сервере. Такие инструменты, как Purchases.products:consume, переносят бизнес-логику на защищенные серверы, предотвращая вмешательство на стороне клиента. Помимо использования этих API, рекомендуем следовать приведенным ниже рекомендациям, чтобы защитить интеграции от несанкционированного доступа.
Защита от подмены геоданных
В Google Play есть встроенные средства защиты, которые не позволяют злоумышленникам использовать ложные геоданные, чтобы извлекать выгоду из разницы в курсах валют (подмена геоданных), злоупотреблять промоакциями и поощрительными программами, а также совершать мошеннические действия с подарочными картами.
Перенесите конфиденциальную логику на серверную часть
По возможности перенесите конфиденциальные данные и логику на серверную часть, которую вы контролируете. Чем больше данных и логики хранится на клиентском устройстве, тем выше риск того, что они будут изменены или взломаны.
Например, в онлайн-игре в шахматы все ходы должны проверяться на сервере, а не на клиентской стороне.
Кроме того, если вы обнаружите уязвимости или проблемы с безопасностью, в зависимости от дизайна системы вам может быть проще отладить, исправить и развернуть обновления на сервере, а не на клиентской части.
Проверка покупок перед предоставлением прав
Особый случай конфиденциальных данных и логики, которые должны обрабатываться на сервере, – это подтверждение покупки и уведомление о ней. После того как пользователь совершит покупку, вам необходимо выполнить следующие действия:
- Отправьте соответствующий purchaseToken на свой сервер. Это означает, что вы должны вести учет всех значений purchaseToken для всех покупок.
- Убедитесь, что значение purchaseToken для текущей покупки не совпадает ни с одним из предыдущих значений purchaseToken. Поскольку purchaseToken является глобально уникальным, вы можете безопасно использовать его в качестве первичного ключа в своей базе данных.
- Используйте конечные точки Purchases.products:get или Purchases.subscriptionsv2:get в Google Play Developer API, чтобы проверить у Google, что покупка действительна.
- Если вы считаете, что покупка была совершена законно, не использовалась и не обрабатывалась ранее, а пользователь прошел все проверки на соответствие требованиям и мошенничество, вы можете предоставить ему доступ к контенту в приложении или подписке.
- Проверка соответствия требованиям и злоупотреблений. Убедитесь, что пользователь по-прежнему соответствует требованиям для получения товара. Если вы настроили процесс оплаты с помощью obfuscatedAccountId или obfuscatedProfileId, убедитесь, что сопоставление покупки соответствует ожидаемому аккаунту пользователя в вашей системе. Выполните дополнительные проверки на злоупотребления, риски или безопасность, необходимые для вашего бэкенда.
- Возврат средств за неправомерные покупки. Если покупка не прошла проверку на действительность или злоупотребление, не предоставляйте право на контент, не подтверждайте и не используйте покупку. Вместо того чтобы позволить покупке автоматически возвратиться из-за отсутствия подтверждения (что может быть вызвано и другими причинами, например истечением времени ожидания обработки), явно отмените покупку и верните средства, используя конечную точку
purchases.subscriptionsv2:revoke(с параметром"fullRefund": {}) для подписок или конечную точкуOrders:refundс параметромrevoke, для которого задано значениеtrue, для однократных покупок. Отмена покупки означает, что пользователь больше не имеет разрешения на нее, и дает Google Play четкий сигнал о том, что покупка была отклонена разработчиком.
- Если для подписки в методе Purchases.subscriptionsv2:get задан параметр linkedPurchaseToken, вам также следует удалить его из базы данных и отозвать право, предоставленное этому токену, чтобы несколько пользователей не могли получить доступ к одному и тому же контенту.
- Предоставлять доступ к контенту следует только при статусе покупки PURCHASED. Также необходимо правильно обрабатывать незавершенные покупки. Если вы заметили резкий рост числа отмененных покупок, возможно, вы предоставляете доступ к контенту, когда покупка ещё находится в статусе ожидания. Подробнее о том, как обрабатывать незавершенные транзакции…
Если вы хотите обработать и подтвердить покупку товара с возможностью повторного использования после предоставления доступа к нему, используйте метод Purchases.products:consume Play Developer API на защищенном внутреннем сервере. Чтобы подтвердить покупку нерасходуемого контента или подписки, вызовите конечную точку Play Developer API Purchases.products:acknowledge или Purchases.subscriptions:acknowledge на защищенном бэкенд-сервере. Подтверждение необходимо, поскольку оно уведомляет Google Play о том, что пользователь получил право на покупку. Подтверждать покупку нужно сразу после того, как вы предоставили пользователю доступ к контенту.
Обратите внимание, что хотя вы можете подтвердить или использовать покупку на стороне клиента через приложение, API на стороне сервера обеспечивают дополнительную защиту от таких проблем, как плохое сетевое подключение и вредоносные действия. Например, пользователь купил товар в приложении, но во время проверки покупки пропало подключение к сети. Если сервер не подтвердит, что пользователь прочитал уведомление, ему может потребоваться снова войти в аккаунт через приложение. Если пользователь не войдет в аккаунт в течение трех дней, средства за покупку будут возвращены автоматически, поскольку она не была подтверждена. Чтобы этого не произошло, сервер должен отправить подтверждение сразу после того, как Google Play сообщит ему, что покупка действительна.
Подробнее об обработке покупок…
Защита разблокированного контента
Чтобы злоумышленники не могли распространять разблокированный контент, не добавляйте его в APK-файл. Вместо этого выполните одно из следующих действий:
- Используйте сервис, который позволяет передавать контент в реальном времени, например фид контента. Кроме того, передача контента в реальном времени позволяет поддерживать его актуальность.
- Используйте удаленный сервер для доставки контента. Если вы передаете контент с удаленного сервера или из сервиса, работающего в реальном времени, вы можете сохранить разблокированный контент в памяти устройства или на SD-карте. Если вы храните контент на SD-карте, обязательно зашифруйте его и используйте ключ шифрования, предназначенный для конкретного устройства.
Как обнаруживать аннулированные покупки и работать с ними
Аннулированные покупки – это покупки, которые были отменены, отозваны или по которым был выполнен возврат платежа. Если пользователь получил контент в приложении или другие материалы, а затем покупка была аннулирована, вы можете узнать причину этого и вернуть контент с помощью Voided Purchases API.
Покупки контента в приложении и подписок могут быть аннулированы по разным причинам, в том числе по следующим:
- Покупка отменена пользователем, разработчиком или Google (включая неподтвержденные автоматически отмененные покупки). Обратите внимание, что в случае с подписками речь идет об отмене покупки, а не самой подписки.
- Покупка была возвращена.
Разработчик приложения отменяет заказ пользователя или возвращает ему средства и устанавливает в консоли флажок "Отозвать". Вы можете принять решение о дальнейших действиях, исходя из причины аннулирования покупки и с учетом предыдущих поведенческих данных пользователя. Мы рекомендуем реализовать одно или несколько из следующих решений:
Возврат неиспользованных товаров. Если покупка аннулирована, вы можете вернуть неиспользованные товары, как если бы они никогда не были куплены. Например, если покупка игровой валюты была аннулирована, вы можете вернуть валюту, которая уже была предоставлена пользователю. Если пользователь уже потратил валюту, вы можете установить отрицательный баланс и ограничить действия в приложении и будущие покупки, пока баланс не станет положительным.
Система предупреждений. Если пользователь нарушил правила впервые, не стоит сразу блокировать его. Попробуйте сначала показать предупреждение в приложении. В отношении повторных нарушителей можно принять более строгие меры.
Временно отключите покупки. Как и в случае с несколькими предупреждениями, вы можете отключить покупки для пользователей, у которых есть аннулированные покупки, пока не выясните, почему они были аннулированы.
Временно или навсегда заблокируйте доступ к приложению. В крайних случаях, когда вредоносные действия повторяются, вы можете временно или навсегда заблокировать доступ к приложению.
Часто отправляйте запросы к Voided Purchases API. Если вы обнаружили одну или несколько аннулированных покупок, отправляйте запросы к Voided Purchases API чаще, чтобы вернуть покупки до того, как пользователь сможет ими воспользоваться. Подробную информацию о квотах Voided Purchases API можно найти в документации по этому API.
Как помочь Google обнаруживать мошенничество до того, как оно произойдет
Некоторые виды мошенничества связаны с тем, что злоумышленники создают несколько аккаунтов Google и аккаунтов в приложении, чтобы скрыть свои действия.
Используйте методы setObfuscatedAccountId и setObfuscatedProfileId в конструкторе для BillingFlowParams, чтобы помочь Google сопоставить аккаунты Google с аккаунтами в приложении.
Google использует эти данные, чтобы выявлять подозрительное поведение и блокировать некоторые виды мошеннических транзакций до их завершения.
Меры против нарушений авторских прав и прав на товарные знаки
Если вы используете удаленный сервер для доставки контента или управления им, настройте в приложении проверку статуса покупки разблокированного контента при каждом обращении пользователя к нему. Это позволяет при необходимости отзывать разрешение на использование и минимизировать пиратство. Если вы обнаружили, что ваш контент распространяется в Google Play, действуйте быстро и решительно. Подробную информацию можно найти в разделе Часто задаваемые вопросы об авторских правах Справочного центра по авторским правам.