По мере роста популярности вашего приложения оно также может привлекать нежелательное внимание злонамеренных пользователей, которые могут захотеть злоупотребить вашим приложением. В этой теме описываются рекомендации, которые следует использовать, чтобы предотвратить эти атаки на вашу интеграцию счетов и уменьшить влияние злоупотреблений в вашем приложении.
Перенесите чувствительную логику на ваш бэкэнд
Насколько позволяет дизайн вашего приложения, переместите конфиденциальные данные и логику на внутренний сервер, который вы контролируете. Чем больше данных и логики у вас на внешнем устройстве, тем более оно уязвимо для изменения или подделки.
Например, онлайн-игра в шахматы должна проверять все ходы на сервере, а не полагаться на то, что сервер всегда отправляет допустимые ходы.
Кроме того, если вы обнаружите уязвимости или проблемы безопасности, в зависимости от архитектуры вашей системы, может быть проще отлаживать, исправлять и развертывать обновления на внутреннем интерфейсе, а не на внешнем.
Проверьте покупки перед предоставлением прав
Особый случай конфиденциальных данных и логики, которые должны обрабатываться в бэкэнде, — это проверка и подтверждение покупки. После того, как пользователь совершил покупку, вам следует сделать следующее:
- Отправьте соответствующий
purchaseToken
на ваш бэкэнд. Это означает, что вы должны вести учет всех значенийpurchaseToken
для всех покупок. - Убедитесь, что значение
purchaseToken
для текущей покупки не совпадает ни с одним из предыдущих значенийpurchaseToken
.purchaseToken
является глобально уникальным, поэтому вы можете безопасно использовать это значение в качестве первичного ключа в вашей базе данных. - Используйте конечные точки
Purchases.products:get
илиPurchases.subscriptionsv2:get
в API разработчика Google Play, чтобы подтвердить в Google, что покупка является законной. - Если покупка является законной и не использовалась в прошлом, вы можете смело предоставить право на внутриигровой элемент или подписку.
- Для подписок, если
linkedPurchaseToken
установлен вPurchases.subscriptionsv2:get
, вам также следует удалитьlinkedPurchaseToken
из вашей базы данных и отозвать право, предоставленноеlinkedPurchaseToken
, чтобы гарантировать, что несколько пользователей не получат право на одну и ту же покупку. - Вам следует предоставлять права только тогда, когда состояние покупки —
PURCHASED
, и убедитесь, что вы правильно обрабатываетеPENDING
покупки. Если наблюдается всплескCANCELED
покупок, вы можете предоставлять права, когда покупка все еще находится в состоянииPENDING
. Вы можете найти дополнительную информацию в разделе Обработка ожидающих транзакций . После предоставления права, если вы хотите потреблять и подтверждать потребляемый продукт, используйте
Purchases.products:consume
Play Developer API на вашем защищенном внутреннем сервере. Чтобы подтвердить непотребляемый продукт или подписку, вызовите соответствующую конечную точку Play Developer API,Purchases.products:acknowledge
илиPurchases.subscriptions:acknowledge
на вашем защищенном внутреннем сервере. Подтверждение требуется, так как оно уведомляет Google Play о том, что пользователю предоставлено право на покупку. Вы должны подтвердить покупку сразу после предоставления права.Обратите внимание, что хотя вы можете подтвердить или использовать покупку на стороне клиента через свое приложение, API на стороне сервера обеспечивают дополнительную защиту от таких проблем, как плохое сетевое подключение и вредоносная активность. Например, представьте, что пользователь купил товар в вашем приложении, но потерял сетевое подключение во время проверки покупки. Без подтверждения сервера ему может потребоваться снова войти в систему через приложение, чтобы завершить процесс подтверждения. В противном случае, если пользователь не войдет в систему в течение трех дней, покупка автоматически возвращается из-за отсутствия подтверждения покупки. Подтверждение сервера предотвращает этот сценарий, отправляя подтверждение, как только Google Play уведомляет сервер о том, что покупка действительна.
Дополнительную информацию о подтверждении и потреблении покупок см. в разделе Обработка покупок .
Защита вашего разблокированного контента
Чтобы предотвратить распространение вашего разблокированного контента злоумышленниками, не включайте его в свой APK-файл. Вместо этого выполните одно из следующих действий:
- Используйте службу в режиме реального времени для доставки вашего контента, например, канал контента. Доставка контента через службу в режиме реального времени также позволяет вам поддерживать его актуальность.
- Используйте удаленный сервер для доставки вашего контента.
Когда вы доставляете контент с удаленного сервера или службы реального времени, вы можете хранить разблокированный контент в памяти устройства или на SD-карте устройства. Если вы храните контент на SD-карте, обязательно зашифруйте контент и используйте ключ шифрования, специфичный для устройства.
Обнаружение и обработка аннулированных покупок
Аннулированные покупки — это покупки, которые были отменены, отозваны или по которым был произведен возврат средств. Если аннулированная покупка ранее предоставила пользователю предметы в приложении или другой контент, вы можете использовать API аннулированных покупок, чтобы узнать причину аннулирования покупки, а также любой связанный контент, который вы можете вернуть.
Покупки товаров в приложении и подписки могут быть аннулированы по разным причинам, включая следующие:
- Покупка отменена пользователем, разработчиком или Google (включая неподтвержденные автоматически отмененные покупки). Для подписок обратите внимание, что это относится к отмене покупки подписки, а не к отмене самой подписки .
- Покупка оплачена обратно.
- Разработчик приложения отменяет или возвращает деньги за заказ пользователя и проверяет опцию «отменить» в консоли.
На основе причины аннулированной покупки и принимая во внимание данные о поведении предыдущих пользователей, вы можете принять решение о дальнейших действиях. Мы рекомендуем реализовать одно или несколько из следующих действий:
- Выполнять возврат средств: когда покупка аннулируется, вы можете вернуть неиспользованные предметы, как будто они никогда не покупались. Например, если покупка внутриигровой валюты была аннулирована, вы можете вернуть валюту, которая уже была предоставлена пользователю. В случае, если пользователь уже потратил валюту, рассмотрите возможность установки отрицательного баланса валюты и ограничения активности приложения и будущих покупок до тех пор, пока баланс валюты не станет положительным.
- Реализация множественных предупреждений: Рассмотрите возможность принятия менее радикальных мер для впервые нарушивших, например, отображение предупреждений в приложении. Для повторных нарушителей рассмотрите более строгие меры.
- Временно отключите покупки: аналогично реализации множественных предупреждений, рассмотрите возможность отключения покупок для пользователей с аннулированными покупками до тех пор, пока вы не сможете более тщательно выяснить, почему покупки были аннулированы.
- Временно или постоянно запретите доступ к вашему приложению. В крайних случаях с повторяющейся вредоносной активностью рассмотрите возможность временного или постоянного запрета доступа к вашему приложению.
- Чаще вызывайте API Voided Purchases: если вы обнаружили одну или несколько аннулированных покупок, рассмотрите возможность более частых вызовов API Voided Purchases, чтобы вернуть покупки до того, как пользователь сможет их использовать. Дополнительную информацию о квотах API Voided Purchases можно найти в документации API Voided Purchases .
Помогите Google обнаружить мошенничество до того, как оно произойдет
Некоторые виды мошенничества связаны с тем, что злоумышленники создают несколько учетных записей Google и приложений, чтобы скрыть свою активность.
Используйте методы setObfuscatedAccountId
и setObfuscatedProfileId
в конструкторе для BillingFlowParams
, чтобы помочь Google сопоставить учетные записи Google с учетными записями в приложении.
Google использует эти данные для обнаружения подозрительного поведения и блокировки некоторых видов мошеннических транзакций до их завершения.
Принятие мер против нарушения прав на товарные знаки и авторские права
Если вы используете удаленный сервер для доставки или управления контентом, пусть ваше приложение проверяет состояние покупки разблокированного контента всякий раз, когда пользователь получает доступ к контенту. Это позволяет вам отозвать использование, когда это необходимо, и минимизировать пиратство. Если вы видите, что ваш контент перераспределяется в Google Play, обязательно действуйте быстро и решительно. Для получения более подробной информации см. страницу Часто задаваемые вопросы об авторских правах в Центре поддержки авторских прав.