【发布时间】:2018-09-26 22:54:49
【问题描述】:
我们有一项服务器端服务,我们只想向付费 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_id、app_item_id 和 download_id。我们可以使用其中任何一个来识别重复收据吗?还是有其他更好的方法来处理这个问题?
【问题讨论】:
-
据我所见。问题是有一种很好的方法可以防止针对 IAP 的重放攻击(检查交易标识符),但对于付费应用程序却没有。那里的链接讨论保护 IAP,而不是应用程序。
-
是的,理论上重放攻击是可能的,但我不认为这值得担心太多。为了成功,攻击者需要一张有效的收据和一种将其放置在他的设备上正确位置的方法,以便您的应用程序可以找到和使用它。这当然是可能的,但对于普通用户来说很复杂。因此,只有真正想要破坏您的系统的攻击者才会尝试这种方法。这些攻击者中有多少存在,如果他们成功了,是否会对您的业务造成任何损害?可能发生的最糟糕的情况是,一群人在不付费的情况下使用您的应用。
-
收据base64字符串可以从POST请求中提取,如果你将它发送到你的服务器
标签: ios app-store storekit receipt-validation