IAP Receipt Validation on iOS 学习总结

本文是对IAP(应用内购买)在iOS上的收据验证的总结和学习,包括IAP的特点、iOS5及以下版本的漏洞以及iOS6的修复策略。在iOS6中,通过特定的代码清单和收据验证方法(如base64转换和JSON交互)可以有效缓解漏洞,确保产品安全。同时,文中提到验证成功时,从App Store服务器返回的status值为0表示验证正确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前看 http://developer.apple.com/library/ios/#releasenotes/StoreKit/IAP_ReceiptValidation/_index.html   进行的归纳总结,还不是很透彻,需要再次深入学习。

一、IAP特点

1.IAP使得用户无需离开软件,便可无缝升级软件功能或扩充内容。 
2. IAP支持付费后下载,所以可以有效的防止盗版。 
3. 开发者无需额外推出试玩版本游戏,直接在免费版本中加入IAP,允许用户付费升级即可,节约开发成本。 
4. 开发者可以无限推出某个App的内容扩展,同时保证持续的收入。 
5. IAP的出现形式多种多样,多见于:打开某功能(如Push);下载新游戏地图;解锁软件中的新内容等等。 
6. IAP购买符合AppStore基本付费策略,玩家一次付款后,可以无限制多次下载IAP内容,不会重复扣费。 
7. 购买IAP内容所使用的账户必须和下载软件本体的账户一致。

8. 和 App Store 中同样的商业条款。您将收到您的程序中付款项价格的 70%,按月付款 — 没有额外的信用卡费用。


二、IAP漏洞(iOS5及以下)

使用者可以透过 In-App Proxy 绕过App 的 IAP机制,让App 误以为已经进行付費进而免费享受付費內容,由此给开发者造成损失。


三、漏洞修复方案(iOS6)

通过苹果的收据验证系统建立保护机制。
1、   App通过连接个人服务器进行验证的影响
   当连接服务时,可能会遭到相思的攻击。
 使用“加密技术”来确保App是连接到个人服务器,并且个人服务器是与App Store服务器相连。
(可利用“缓解策略”作为起点)
2、   App通过连接到App Store服务器执行验证的影响
  若App从设备直接连接到App Store服务器,那么App会受到这个漏洞的影响。解决方案就是检查如下的信息:
1) 用于连接到App Store服务器的SSL证书是一个EV证书。
2) 从验证返回的信息和SKPayment对象的信息相符合。
3) 收据具有一个有效的签名。
4) 新的事务有一个独一无二的事务ID。
3、如何验证已完成的事务
1)消耗:
若以保存了收据(无论是在设备还是在服务器中),执行你的“缓解策略”之后再次验证收据。若你未保存收据,则无法验证以前的事务,无法采取任何行动。
2)非自耗:
抛开当前的收据,执行恢复操作并验证新的收据。避免在此过程中,重新下载的内容已经在设备上。

4、代码清单(缓解策略)

注意:此清单中使用的如下符号——

kSecTrustInfoExtendedValidationKey 
SecTrustCopyInfo
并非公共API。App仅在此目的时被允许使用它们。

将代码加入到你的项目中:

1)下载压缩文件。
2) 项目中加入以下文件——
 VerificationController.h   VerificationController.m 
3)连接 Securityframework
4)提供了一个Base64的编码和解码器,当验证成功时执行。


四、产品防护

https://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/VerifyingStoreReceipts/VerifyingStoreReceipts.html
http://www.himigame.com/iphone-cocos2d/673.html
1、IAP Cracker插件
 App Store的付流程其方式是当用费产购买IAP Cracker返回一个购买成功的消息无需白了post数据App Store都没有!),然后我们App收到假的交易成功的消息直接加装加各种….
 
2、IAP Cracker(下载 json_base.rar
在付费代码中加入进一步的验证判断:

 
- (void) paymentQueue:(SKPaymentQueue*) queueupdatedTransactions: (NSArray *)transactions//交易结果
{
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchased://交易完成
                 if([self putStringToItunes:transaction.transactionReceipt]){
                     //这里给用户添加钱阿,装备阿什么的
                 }
                   break;
             ......代码省略
         }
     }
}

putStringToItunes函数

1)首先我们将传入的收据data类型变量进行base64转换成string类型

2)然后将此收据以json的形式发送给appstore进行验证!这里注意!一定要以json形式发送,否则appstore server端不识别!

3)最后再次利用jsonappstore server返回的字段json数据行解析只需要解析出 status keyvalue即可

appstore验证收据正确解析出来的 statuskeyvalue0()


其他文章参考:

http://www.himigame.com/iphone-cocos2d/673.html






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值