iOS开发基础97-应用内购(In-App Purchase)的安全性解析与收据处理流程

在iOS应用内购(In-App Purchase, IAP)中,确保支付过程的安全性至关重要。应用内购的核心在于验证购买收据(receipt),确保用户实际完成购买,并根据购买情况发放相应的商品。本文将详细介绍两种收据验证方法及其流程,并分析常见的攻击手段与防护策略。

两种收据验证方法

1. 客户端直接验证

客户端可以直接向苹果的服务器发送请求验证收据。如果验证成功,客户端自行发放商品。然而,这种方法并不安全,因为客户端的所有信息都会受到攻击者操控。

2. 服务端验证

客户端将收据传递到服务端,由服务端向苹果服务器验证并根据验证结果发放商品。按照安全性原则,服务端的处理更为可靠,能够有效防止多种攻击。

推荐的验证流程

为了确保支付安全,推荐采用服务端验证方法。具体步骤如下:

  1. 客户端支付成功,获取收据。
  2. 客户端将收据传递到服务端。
  3. 服务端将收据发送到苹果服务器验证。
  4. 如果验证成功,服务端根据收据中的信息发放商品。

常见的攻击手段及防范措施

1. 劫持苹果服务器攻击

攻击者通过DNS污染让客户端连接到伪造的苹果服务器,返回虚假的验证成功响应。这种攻击主要针对客户端直接验证的方法。服务端验证则不受该攻击影响。

2. 重复验证攻击

同一个收据可以被多次使用,如果服务端没有防重复验证机制,就会导致多次充值。防范方法是将收据的MD5哈希值存储起来,每次请求时检查是否重复。

3. 跨应用攻击

攻击者在其他应用中获取合法收据,然后在目标应用中使用。防范措施是检查苹果验证返回的bundle_id,确保与应用的bundle_id一致。

4. 替换价格攻击

攻击者使用低价商品的收据购买高价商品。防范方法是通过苹果验证返回的数据中的product_id来确认商品,而不是依赖客户端提供的product_id

5. 歧义攻击

在iOS 6中,status=0表示支付成功。但在iOS 7及以后,status=0仅表示收据整体合法,具体支付详情需要通过in_app字段确认。因此,需要根据iOS版本正确解析收据数据。

6. 中间人攻击

攻击者伪造苹果服务器,截取和篡改支付过程。防范措施是确保不同用户的收据不能互用,同时需要对收据进行加密处理,以防止伪造和篡改。

iOS 支付的详细流程

  1. 客户端支付成功并获取收据:客户端完成支付后,从苹果服务器获取支付收据。

  2. 客户端将收据传递到服务端:将上述收据通过API发送到服务端进行验证。

  3. 服务端验证收据

    • 服务端向苹果服务器发送收据并验证。
    • 如果status为21007,说明运行在沙盒环境,应按需求处理。注意,iOS审核过程中支付使用的沙盒模式。
    • 如果status为0,解析收据中的in_app字段,遍历所有交易记录,并确保记录的transaction_idoriginal_transaction_id唯一,以防重复处理。

总结

支付作为应用的核心模块,安全性至关重要。以下是主要的防护策略:

  1. 避免客户端直接验证收据。客户端的所有信息都是潜在不可信的。

  2. 在服务端进行收据验证。确保通过苹果服务器验证收据的真实性。

  3. 防止重复验证。通过收据的MD5哈希值进行重复性检查。

  4. 校验跨应用收据。确保验证返回的bundle_id与应用的bundle_id一致。

  5. 核对商品价格。根据product_id来确定商品类型。

  6. 正确处理不同iOS版本的收据解析。避免因为支付状态变化产生的歧义攻击。

  7. 防止中间人攻击。通过加密和验证确保收据和用户信息的安全。

参考资料

以下为苹果验证返回数据的示例,展示了收据的基本结构:

{
  "status": 0,
  "environment": "Production",
  "receipt": {
    "download_id": 75017873837267,
    "adam_id": 1149703708,
    "request_date": "2017-01-13 06:57:20 Etc/GMT",
    "app_item_id": 1149703708,
    "original_purchase_date_pst": "2016-11-17 18:57:09 America/Los_Angeles",
    "version_external_identifier": 820252187,
    "receipt_creation_date": "2017-01-13 05:04:52 Etc/GMT",
    "in_app": [
      {
        "is_trial_period": "false",
        "purchase_date_pst": "2017-01-12 21:04:52 America/Los_Angeles",
        "original_purchase_date_pst": "2017-01-12 21:04:52 America/Los_Angeles",
        "product_id": "com.example.app.gold.1",
        "original_transaction_id": "350000191094279",
        "original_purchase_date": "2017-01-13 05:04:52 Etc/GMT",
        "original_purchase_date_ms": "1484283892000",
        "purchase_date": "2017-01-13 05:04:52 Etc/GMT",
        "purchase_date_ms": "1484283892000",
        "transaction_id": "350000191094279",
        "quantity": "1"
      }
    ],
    "original_purchase_date_ms": "1479437829000",
    "original_application_version": "26",
    "original_purchase_date": "2016-11-18 02:57:09 Etc/GMT",
    "request_date_ms": "1484290640800",
    "bundle_id": "com.example.app",
    "receipt_creation_date_pst": "2017-01-12 21:04:52 America/Los_Angeles",
    "application_version": "32",
    "request_date_pst": "2017-01-12 22:57:20 America/Los_Angeles",
    "receipt_creation_date_ms": "1484283892000",
    "receipt_type": "Production"
  }
}

通过研究和实践上述流程和防护措施,将能够大大提升iOS应用内购的安全性,确保用户交易的合法性与安全性。

posted @   Mr.陳  阅读(4121)  评论(0编辑  收藏  举报
编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
点击右上角即可分享
微信分享提示