标签: iOS IAP,支付

苹果应用内支付(iOS IAP)的流程与常用攻击方式

苹果应用内支付(iOS IAP)的流程与常用攻击方式

常见支付流程

iap(in app purchase)指苹果应用内支付, 目前主要有两种方式。

  1. 1. 客户端直接verify苹果的receipt 如果verify成功 自行发放商品
  2. 2. 客户端将receipt传给server,由server进行验证并发放商品

按照安全性原则, 客户端的所有信息都是不可信的,而且支付是业务中的核心模块,所以应该选择第二种。

下面简要介绍下,第二种方式的简单流程。

  1. 1. 客户端支付成功,拿到receipt
  2. 2. 客户端将receipt传到服务端
  3. 3. 服务端去apple验证receipt 如果验证成功 就发放receipt中的商品

支付安全性

作为支付,安全性是*位的,下面简要分析一下常用的攻击手段。

  1. 劫持apple server攻击 => 通过dns污染,让客户端支付走到假的apple_server,并返回验证成功的response。 这个主要针对支付方式一 如果是支付方式二 就无效。
  2. 重复验证攻击 => 一个receipt重复使用多次
  3. 跨app攻击 => 别的app的receipt用到我们app中来
  4. 换价格攻击 => 低价商品代替高价商品
  5. 歧义攻击 => iap支付之前的status=0表示verify成功 而现在变为status=0只能表示receipt合法 具体支付详情需要通过in_app字段决定 For iOS 6 style transaction receipts, the status code reflects the status of the specific transaction’s receipt.
  6. 中间人攻击 => 伪造apple_server,如果用户支付就将

劫持apple server攻击

通过dns污染,让客户端通过假的apple_server进行verify,从而认为自己支付成功。这个主要针对**支付方式一**,如果是支付方式二,就没效果了。常见的iap hack软件@iAPFree @iAP Cracker 就是用的类似原理。

重复验证攻击

  1. 因为同一个receipt,如果*次验证成功,那么之后每次验证都会成功。如果服务端没有判重机制,就会导致一个receipt被当做多次充值处理。
  2. 为了预防这种情况,我们可以将receipt做一次md5得到receipt_md5, 每次发送充值请求的时候就按照receipt_md5判重,如果重复就停止商品发放。

跨app攻击

  1. 通过在别的app中拿到receipt,然后发送到我们app中。因为这个receipt是合法的而且apple不会验证请求的源,所以这个receipt是可以验证通过的。
  2. 对于这种情况,我们可以判断apple verify的返回值apple_callback_data中对应的bundle_id和我们app的bundle_id是否一样来进行验证。

换价格攻击

  1. 在同一个app中,用低价商品的receipt伪造购买高价商品。这时候bundle_id和我们app的bundle_id是一致的。
  2. 针对这种情况, 我们可以从apple verify的返回值apple_callback_data中拿到对应的product_id, 并按照product_id来进行充值。 **不要信任客户端的product_id**

歧义攻击

  1. 在iOS6的时候,status=0表示此次支付成功,而现在变为status=0只表示receipt**整体上**合法。
  2. 所以,对iOS7即使是一个过期订单,也会返回status=0,如果还按照iOS6的逻辑处理,就会导致假充值。针对iOS7,我们应该不只通过status,还要通过in_app中的内容,来决定如何发放商品。
  3. “`
  4. For iOS 6 style transaction receipts, the status code reflects the status of the specific transaction’s receipt.
  5. For iOS 7 style app receipts, the status code is reflects the status of the app receipt as a whole. For example, if you send a valid app receipt that contains an expired subscription, the response is 0 because the receipt as a whole is valid.

中间人攻击

  1. 伪造apple server,将我们的支付请求转发到真的apple_server,拿到合法的receipt,并弄个假的receipt给客户端。这样就拿到一个合法的凭证。利用这个合法的receipt,伪造别人充值的请求,从而达到帮别人充值的目的。
  2. 针对中间人攻击,*重要的是保证a用户的支付receipt,不能被b用户使用。但是apple为了保护隐私,receipt中没有任何用户的个人信息,这就需要我们自己来保证。目前我们用加密的手段来做这个保证。

iOS支付的详细流程

  1. 客户端拿到apple的receipt 并发送到server
  2. server拿到这个receipt,向苹果验证得到apple_callback_data
  3. 如果apple_callback_data的status是21007,说明是沙盒模式(不用花钱就可以购买) 要根据具体需求判断处理逻辑,需要注意的是,ios的审核在支付的时候就采用的沙盒模式。
  4. 如果apple_callback_data的status是0,就要从apple_callback_data[‘receipt’][‘in_app’]这个list中拿到所有的记录,每一个进行充值。然后记录transaction_id和original_transaction_id来防止同一个transaction被重复使用。

    https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Restoring.html

    https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ReceiptFields.html#//apple_ref/doc/uid/TP40010573-CH106-SW1 => Original Transaction Identifier

  5. 返回所有充值成功和重复的transaction_id, 有client来complete transaction

summary

支付作为核心模块,除了技术上的保证,商务也应该每周进行一次对账。如果发现apple上的收入和服务端记录的收入有比较大的差距,就应该抓紧查看原因。

*后给出一个apple_callback_data的例子

  1. {
  2. “status”: 0,
  3. “environment”: “Production”,
  4. “receipt”: {
  5. “download_id”: 75017873837267,
  6. “adam_id”: 1149703708,
  7. “request_date”: “2017-01-13 06:57:20 Etc/GMT”,
  8. “app_item_id”: 1149703708,
  9. “original_purchase_date_pst”: “2016-11-17 18:57:09 America/Los_Angeles”,
  10. “version_external_identifier”: 820252187,
  11. “receipt_creation_date”: “2017-01-13 05:04:52 Etc/GMT”,
  12. “in_app”: [
  13. {
  14. “is_trial_period”: “false”,
  15. “purchase_date_pst”: “2017-01-12 21:04:52 America/Los_Angeles”,
  16. “original_purchase_date_pst”: “2017-01-12 21:04:52 America/Los_Angeles”,
  17. “product_id”: “com.lucky917.live.gold.1.555”,
  18. “original_transaction_id”: “350000191094279”,
  19. “original_purchase_date”: “2017-01-13 05:04:52 Etc/GMT”,
  20. “original_purchase_date_ms”: “1484283892000”,
  21. “purchase_date”: “2017-01-13 05:04:52 Etc/GMT”,
  22. “purchase_date_ms”: “1484283892000”,
  23. “transaction_id”: “350000191094279”,
  24. “quantity”: “1”
  25. }
  26. ],
  27. “original_purchase_date_ms”: “1479437829000”,
  28. “original_application_version”: “26”,
  29. “original_purchase_date”: “2016-11-18 02:57:09 Etc/GMT”,
  30. “request_date_ms”: “1484290640800”,
  31. “bundle_id”: “com.lucky917.ios.Live”,
  32. “receipt_creation_date_pst”: “2017-01-12 21:04:52 America/Los_Angeles”,
  33. “application_version”: “32”,
  34. “request_date_pst”: “2017-01-12 22:57:20 America/Los_Angeles”,
  35. “receipt_creation_date_ms”: “1484283892000”,
  36. “receipt_type”: “Production”
  37. }
友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速