随着您的应用越来越受欢迎,它也会引起恶意用户的注意,他们可能会滥用您的应用。本主题介绍了一些建议,您应该利用这些建议帮助防止这些针对结算服务集成的攻击,并减少滥用行为对您的应用的影响。
将敏感逻辑移至后端
在应用设计允许的范围内,尽可能将敏感数据和逻辑移至您控制的后端服务器。前端设备中的数据和逻辑越多,就越容易遭到修改或篡改。
例如,在线国际象棋游戏应该在后端验证每一步,而不是相信前端发送的每一步始终都是合法的。
此外,如果发现了漏洞或安全问题,根据您的系统设计,在后端而非前端进行调试、修复和发布更新可能也会更容易。
在授予权利前验证购买交易
应该在后端处理敏感数据和逻辑的一种特殊情况是购买交易验证和确认。用户完成购买交易后,您应该执行以下操作:
- 将相应的
purchaseToken
发送到后端。也就是说,您应维护一份所有购买交易的所有purchaseToken
值记录。 - 验证当前购买交易的
purchaseToken
值是否与以前的任何purchaseToken
值都不匹配。purchaseToken
具有全局唯一性,因此您可以放心地使用此值作为数据库中的主键。 - 使用 Google Play Developer API 中的
Purchases.products:get
或Purchases.subscriptionsv2:get
端点向 Google 验证购买交易是否合法。 - 如果购买交易合法且过去没有使用过,那么您就可以放心地授予对应用内商品或订阅的权利。
- 对于订阅,在
Purchases.subscriptionsv2:get
中设置linkedPurchaseToken
时,您还应从数据库中移除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 文件中,而是执行以下操作之一:
- 使用实时服务发送内容,例如内容 Feed。通过实时服务发送内容还可以使内容始终保持最新状态。
- 使用远程服务器发送内容。
通过远程服务器或实时服务发送内容时,您可以将未锁定内容存储在设备内存中或设备的 SD 卡上。如果将内容存储在 SD 卡上,请务必加密内容并使用设备专用加密密钥。
检测并处理作废的购买交易
作废的购买交易是指已经取消、撤消或退款的购买交易。如果作废的购买交易此前已向用户授予应用内商品或其他内容,您可以使用 Voided Purchases API 获悉购买交易作废的原因并获得您可以收回的任何关联内容。
购买应用内商品和订阅的交易可能出于各种原因而作废,其中包括:
- 用户、开发者或 Google 取消购买交易。请注意,对于订阅,这是指取消购买订阅的交易,而不是取消订阅本身。
- 购买交易被退款。
- 应用开发者取消用户订单或退款,并在控制台中选中“撤消”选项。
您可以根据购买交易作废的原因并考虑用户以前的行为数据来决定相应的操作。我们建议您执行以下一项或多项操作:
- 执行收回商品操作:如果购买交易作废,您可以收回未使用的商品,视同其从未出售过。例如,如果游戏币购买交易作废,您可以收回已经授予用户的游戏币。如果用户已经花掉了游戏币,可以考虑将游戏币余额设置为负数,并限制应用活动和未来的购买交易,直到游戏币余额为正数。
- 实施多次警示:可以考虑对初犯者采取比较温和的措施,比如显示应用内警告。对于屡犯者,应考虑采取更严厉的措施。
- 暂时禁止购买:与实施多次警示类似,您也可以考虑在您能够更彻底地调查购买交易作废的原因之前,禁止购买交易曾经作废的用户进行购买。
- 暂时或永久禁止访问您的应用:对于屡次实施恶意活动的极端情况,应考虑暂时或永久禁止对方访问您的应用。
- 频繁调用 Voided Purchases API:当您检测到一笔或多笔作废的购买交易时,可以考虑更频繁地调用 Voided Purchases API,以便在用户使用前收回所购商品。如需了解有关 Voided Purchaisse API 配额的更多信息,请参阅 Voided Purchases API 文档。
帮助 Google 在欺诈发生前及时发现欺诈行为
实施某些类型的欺诈行为的恶意用户会创建多个 Google 账号和应用内账号来隐藏他们的活动。
将 builder 中的 setObfuscatedAccountId
和 setObfuscatedProfileId
方法用于 BillingFlowParams
可帮助 Google 将 Google 账号映射到应用内账号。
Google 会使用这些数据检测可疑行为,并在某些类型的欺诈性交易完成之前及时加以阻止。
针对商标和版权侵犯行为采取行动
如果您使用远程服务器发送或管理内容,请确保当用户访问内容时,应用能够验证未锁定内容的购买状态。这样,您就可以根据需要撤消使用权,并最大限度地减少盗版。如果您看到自己的内容在 Google Play 上被重新分发,请务必迅速、果断地采取行动。如需了解更多详情,请参阅版权帮助中心内的版权常见问题解答页面。