之前看 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、代码清单(缓解策略)
注意:此清单中使用的如下符号——
并非公共API。App仅在此目的时被允许使用它们。kSecTrustInfoExtendedValidationKeySecTrustCopyInfo
将代码加入到你的项目中:
1)下载压缩文件。2) 项目中加入以下文件——
VerificationController.h VerificationController.m
3)连接 Securityframework
4)提供了一个Base64的编码和解码器,当验证成功时执行。
四、产品防护
https://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/VerifyingStoreReceipts/VerifyingStoreReceipts.htmlhttp://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)最后再次利用json对appstore server返回的字段(json数据)进行解析,我们只需要解析出 status 这个key的value即可!
当appstore验证收据正确时我们解析出来的 status这个key的value值为0(零)!
其他文章参考:
http://www.himigame.com/iphone-cocos2d/673.html