如果我实现 Apple 的 VerificationController.m 示例,是否还需要进行服务器端收据验证?此外,如果你做服务器端,那么似乎没有理由实施 VerificationController.m 因为你没有从设备联系 Apple 的服务器。
最好的情况是,我宁愿只实现 VerificationController.m,因为我没有很好的方法来运行我自己的 https 服务器。够了吗?该应用程序在 iOS 5+ 上运行
如果我实现 Apple 的 VerificationController.m 示例,是否还需要进行服务器端收据验证?此外,如果你做服务器端,那么似乎没有理由实施 VerificationController.m 因为你没有从设备联系 Apple 的服务器。
最好的情况是,我宁愿只实现 VerificationController.m,因为我没有很好的方法来运行我自己的 https 服务器。够了吗?该应用程序在 iOS 5+ 上运行
这比它第一次出现的要棘手,所以我可能会稍微弄错,但这里是:
最初的攻击依赖于 iOS ≤ 5.x 中的两个弱点:
这允许用户/攻击者伪装成 App Store 服务器并出示有效收据以供他人购买。
VerificationController 无法修复第一个弱点(它无法改变 StoreKit 与 Apple 的对话方式);它主要只是修复了第二个。它似乎还检查了比应有的更多的东西(但我在这里可能完全错了),包括 StoreKit 可能已经检查的一堆东西。
客户端验证不能防止有人入侵客户端,这在越狱手机上非常容易。如果购买的东西很容易被黑客入侵(例如游戏的弹药/关闭广告),这不是一个真正的问题。
当服务器提供所购买的东西(例如 DLC/Skype 信用/FarmCoins)时,服务器端验证是可取的。
通常,在您将收据转换为购买的商品时进行验证。
但是,VerificationController 存在一些问题:
//Validation suceeded. Unlock content here.
如果收据验证连接失败,您将永远无法到达,这很容易在较差的 3G 连接上发生。这对于非消耗性交易可能不是问题(我认为恢复的交易会获得新的交易 ID),但意味着消耗品会永远丢失。您可以推迟调用-[SKPaymentQueue finishTransaction:]
直到收据验证成功,但这会在队列中留下不完整的交易——希望它们最终到期而不向用户收费。-connection:didReceiveData:
返回所有响应数据。这对于服务器和 NSURLConnection 的实现细节可能是正确的,但依赖它是不明智的。