我们有一个服务器端服务,我们只想提供给付费iOS应用程序的有效用户。 (请注意,这是付费的iOS应用程序,而不是带有IAP的免费应用程序。)

当我们使用 appStoreReceiptURL 检查沙盒应用程序收据并将其发送到我们的服务器端时,我们看到这样的收据:

{
  "receipt_type": "ProductionSandbox",
  "adam_id": 0,
  "app_item_id": 0,
  "bundle_id": "com.example.myapp",
  "application_version": "1.1.1",
  "download_id": 0,
  "version_external_identifier": 0,
  "receipt_creation_date": "2018-04-16 23:53:58 Etc/GMT",
  "receipt_creation_date_ms": "1523922838000",
  "receipt_creation_date_pst": "2018-04-16 16:53:58 America/Los_Angeles",
  "request_date": "2018-04-17 03:25:42 Etc/GMT",
  "request_date_ms": "1523935542798",
  "request_date_pst": "2018-04-16 20:25:42 America/Los_Angeles",
  "original_purchase_date": "2013-08-01 07:00:00 Etc/GMT",
  "original_purchase_date_ms": "1375340400000",
  "original_purchase_date_pst": "2013-08-01 00:00:00 America/Los_Angeles",
  "original_application_version": "1.0",
  "in_app": []
}

我担心这张收据会带来重播攻击。在重播攻击中,一个设备购买了该应用程序并提交了有效的收据,但是第二个未授权的设备存储并传输了第一张收据的精确副本。由于第一张收据是由Apple签署的,因此副本显示为有效。

理想情况下,我们通过观察收据中的唯一标识符来克服重播攻击;如果有人尝试重新发送相同的收据ID,我们会知道它是重复的。正是由于这个原因,IAP收据中包含一个transaction_identifier字段。

但是似乎没有唯一的标识符可用于识别带有付费应用收据的重播攻击。黑客可以通过不同的设备将收据转发给我们,我们将无法知道它是重复的收据还是新的原始收据。

说了这么多,我的目光投向了沙盒收据中那些为0的_id数字:adam_idapp_item_iddownload_id。我们可以使用其中任何一种来识别重复的收据吗?还是有其他更好的方法来处理此问题?

最佳答案

无法检测付费应用的重复收据。没有记录adam_idapp_item_iddownload_id,因此开发人员不能出于安全目的而依赖它们。这与IAP收据不同,IAP收据中包含可以重复数据删除的transaction_identifier

但是,有一种可能的解决方法。您可以向用户提供价格为0美元(免费)的非消耗性IAP,并要求用户“购买”它才能访问服务器端功能。由于它是非消耗性的IAP,因此每个付费应用程序用户最多只能购买一次。

用户同意免费的“购买”并登录到App Store进行访问有点麻烦,但是一旦他们这样做,他们将拥有一个与他们的付费应用程序收据绑定(bind)的IAP。免费的IAP收据包括交易标识符;服务器可以使用交易ID对购买进行重复数据删除。

关于ios - 防止重播攻击appStoreReceiptURL应用收据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49870212/

10-14 22:14