【问题标题】:What is the purpose of validting an In App Purchase receipt?验证应用内购买收据的目的是什么?
【发布时间】:2016-02-09 14:41:35
【问题描述】:

我已经实现了对 SKProducts 的购买,并且从应用商店对其进行了验证,但我不确定此验证的目的是什么。苹果文档说:

应用程序或应用程序内购买的收据是应用程序销售和在应用程序内进行的任何应用程序内购买的记录。您可以将收据验证代码添加到您的应用程序中,以防止未经授权的应用程序副本运行。

这是否意味着在未验证应用内购买收据的情况下无法索取应用内购买的价格?还是与应用的真实性有关?

【问题讨论】:

  • 有些坏人可能会入侵您的应用程序或他们的设备,以欺诈性地进行应用内购买。验证收据可帮助您检测这种欺诈行为,但您不必这样做

标签: ios in-app-purchase


【解决方案1】:

@Paulw11 正确地评论道,“坏人可能会入侵您的应用或他们的设备以欺诈性地进行应用内购买”,但让我详细说明一下。

在用户安装了名为iAP CrackerCydia 应用程序的任何越狱iOS 设备上都可以找到最简单的欺诈性购买示例。这让用户可以绕过 iTunes 应用商店进行应用内购买,从而免费获得购买。

iAP Cracker 的假设是您的应用没有验证收据,因此会提供假收据来代替真实收据。

有两种验证收据的方法:本地验证和远程验证。

Locally validating 收据可以确保苹果随收据提供的 GUID、bundleId 和 opaque value 与同样随收据提供的signature 匹配。

欺诈性购买通常会使用重复攻击,这些攻击要么使用来自您应用的有效收据,要么来自其他用户在其他日期的有效收据。在这种情况下,bundleId 将匹配,但 GUID 不匹配。或者来自完全不同的应用程序的收据,例如,我经常看到来自愤怒的小鸟但与我的应用程序无关的收据。因此在这些情况下,bundleId 和 GUID 不正确,因此签名将不匹配。

收据也使用 Apple 的 RSA 私钥签名,这意味着如果使用生成的收据进行攻击,PKCS #7 容器签名将无效。

对于Validating receipts remotely,您可以将 Base64 编码的收据发送到 Apple 的服务器进行验证。您很可能会在服务器端环境中执行此操作。当 Apple 收到收据时,它将验证 PKCS #7 和 bundleId,如果 bundleId 不是您自己的一个,它将失败,但重要的是要注意它没有验证 GUID 的能力。

但是,远程验证确实具有提供额外信息的额外好处,例如为自动续订订阅购买进行的续订和取消,如果您需要将订阅与您自己的用户关联起来,这很方便数据库。

为了尽可能提高安全性,明智的做法是在本地和远程建立收据验证。黑客会进行黑客攻击,他们可能会在未来找到绕过本地验证的方法,但远程验证的攻击向量仍然很小。

不要低估欺诈性购买发生的频率,我发现 iOS 上的欺诈率高达 30%,Android 上高达 80%。 来源:我是一名应用内购买顾问。

【讨论】:

  • 谢谢。一个关于此的问题:是否可以伪造 StoreKit 支付队列,使其认为进行了购买?我想 Apple 正在以一种非常安全的方式将其传达给您的应用程序。这也可以恶搞吗?没有它,任何攻击都不会起作用。
  • @ZS StoreKit 支付队列被黑客有效地存根,完全绕过网络层。我想可以通过在本地更改 DNS 区域来劫持 StoreKit 发出的网络请求,但我想欺骗证书将是一个挑战。
猜你喜欢
  • 2010-11-20
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多