Apple的新验证控制器的异步部分是否必要?

时间:2012-07-24 17:15:15

标签: iphone objective-c ios ipad in-app-purchase

我在这里查看Apple的Inification Purchases验证控制器补丁:https://developer.apple.com/library/ios/#releasenotes/StoreKit/IAP_ReceiptValidation/_index.html

我计划实施服务器验证,但不需要立即做出响应。

新代码的异步部分是否绝对必要。它是否比天真的服务器端验证提供了任何优势?

如果我可以立即使用解析和检查并获得好处,那就太棒了。

谢谢!

编辑:如果没有一些代码,这个问题会有点空洞:

我正在谈论将主要的verifyPurchase函数更改为仅包含:

- (BOOL)verifyPurchase:(SKPaymentTransaction *)transaction;
{
    return [self isTransactionAndItsReceiptValid:transaction];
}

...并摆脱客户 - >服务器帖子。我是否仍然容易受到最近的黑客攻击?

1 个答案:

答案 0 :(得分:3)

查看代码后,您的问题会更有意义。

有问题的攻击是有人提出其他人的其他有效收据。收据数据中似乎没有任何东西将其与设备/购买者联系起来。您可以通过检查购买日期在某种程度上缓解这种情况(但如果设备有准确的时间,则仅 ,这取决于用户的控制)。

(如果客户端生成了一个必须与收据匹配的256位随机数,攻击无效。攻击者显然可以破解二进制/ PRNG,但无论如何你都是&#39已经输了。)

顺便提一下,代码有很多问题:

  • 唯一检查服务器证书的是它是EV证书。这应该很容易伪造,因为攻击者可以完全控制CA.
  • 交易ID永久添加到已经看过的"列表中。网络检查完成之前-isTransactionAndItsReceiptValid:中的事务,但内容仅在网络返回后解锁。如果连接失败,永远不会重新验证收据,因此用户的钱将有效地进入黑洞。
  • 它希望事务发生在验证它的同一设备上。
  • 它希望ITC_CONTENT_PROVIDER_SHARED_SECRET嵌入到可执行文件中(使用越狱设备进行解密很简单)。
  • 假设-connection:didReceiveData:返回完整的收据数据(由于碎片可能不是这种情况,但由于Apple控制服务器实施,因此可能会保证这种情况。)