zoukankan      html  css  js  c++  java
  • 苹果内付费安全防范-内付费破解过滤

    苹果内付费防刷单

    应用内购买流程

    用户点击购买——>确认购买内容——>通过App Store账户验证——>苹果服务器验证并扣款——>苹果向用户返回购买成功收据receipt——>客户端把收据发送到后台——>后台拿收据去apple服务器验证——>在自己的后台记录购买是否成功——>返回给客户端相应结果

    客户端拿到票据receipt之后,将票据传给服务端进行二次校验,验证票据真伪:
    具体校验方式见苹果内付费二次校验

    检验完成后苹果返回数据如下:

    {
        receipt = { //返回的是JSON数据
            "bid" = "com.wmcy.Buggo";
            "bvrs" = 1;
            "item_id" = 573837050;
            "original_purchase_date" = "2015-06-03 10:00:10 Etc/GMT";
            "original_purchase_date_ms" = 1433325610666;
            "original_purchase_date_pst" = "2015-06-03 03:00:10 America/Los_Angeles";
            "original_transaction_id" = 1000000157763130;
            "product_id" = "Iap_CaoCaoBXS_Arm_Buy1";
            "purchase_date" = "2015-06-03 10:00:10 Etc/GMT";
            "purchase_date_ms" = 1433325610666;
            "purchase_date_pst" = "2015-06-03 03:00:10 America/Los_Angeles";
            "quantity" = 1;
            "transaction_id" = 1000000157763130;
            "unique_identifier" = f8ba3cb4be1589fb9b75df93babb3560d280781d;
            "unique_vendor_identifier" = "F9E0DAB3-5BC0-4196-B9F9-13C46616674D";
        };
        status = 0;
    }
    

    如果苹果返回status值为0,则表示票据验证成功。很多应用此时则直接进行发货操作。


    当我发现日志中经常出现以下票据时:

    {"receipt":{"original_purchase_date_pst":"2012-07-12 05:54:35 America/Los_Angeles", "purchase_date_ms":"1342097675882", "original_transaction_id":"170000029449420", "original_purchase_date_ms":"1342097675882", "app_item_id":"450542233", "transaction_id":"170000029449420", "quantity":"1", "bvrs":"1.4", "version_external_identifier":"9051236", "bid":"com.zeptolab.ctrexperiments", "product_id":"com.zeptolab.ctrbonus.superpower1", "purchase_date":"2012-07-12 12:54:35 Etc/GMT", "purchase_date_pst":"2012-07-12 05:54:35 America/Los_Angeles", "original_purchase_date":"2012-07-12 12:54:35 Etc/GMT", "item_id":"534185042"}, "status":0}
    

    可以看到,此票据可以通过苹果校验,但是每次校验都是同一个receipt,而苹果没有校验次数和日期限制,因此该票据时通过刷单破解工具进行校验的。该票据在网上也存在:http://www.2cto.com/Article/201210/161534.html。

    如果此时通过刷单工具IAP Free游戏内购破解的防御,进行校验是能够通过我们的验证,因此,在进行完苹果的校验之后,进行一次本地校验显得尤为重要。


    本地校验方法一 (bid判断)

    上面票据可以看到一个字段:bid. 可以针对该字段进行过滤,如果该字段不是苹果后台自己应用的bid,则进行屏蔽过滤,或者进行封号处理。

    [2016-05-31 08:37:20.277] [ERROR] ArcadeFishIAP - 苹果 : bid错误 bid = com.zeptolab.ctrexperiments
    [2016-05-31 08:37:20.278] [ERROR] ArcadeFishIAP - 苹果: 本地验证票据未通过 : Error: bid异常
    [2016-05-31 08:37:26.242] [ERROR] ArcadeFishIAP - 苹果 : bid错误 bid = com.zeptolab.ctrexperiments
    [2016-05-31 08:37:26.242] [ERROR] ArcadeFishIAP - 苹果: 本地验证票据未通过 : Error: bid异常
    [2016-05-31 08:37:49.576] [ERROR] ArcadeFishIAP - 移动MM:通知服务器发放物品 成功 
    [2016-05-31 08:38:19.702] [ERROR] ArcadeFishIAP - 苹果:服务器发放物品 成功 uid = 49478  goodsID = 30010
    [2016-05-31 08:47:28.770] [ERROR] ArcadeFishIAP - 苹果 : bid错误 bid = com.zeptolab.ctrexperiments
    [2016-05-31 08:47:28.771] [ERROR] ArcadeFishIAP - 苹果: 本地验证票据未通过 : Error: bid异常
    [2016-05-31 08:48:10.820] [ERROR] ArcadeFishIAP - 苹果 : bid错误 bid = com.zeptolab.ctrexperiments
    [2016-05-31 08:48:10.821] [ERROR] ArcadeFishIAP - 苹果: 本地验证票据未通过 : Error: bid异常
    
    

    可以看到仅仅这个bid判断就可以过滤很多IAP free 工具的刷单。


    本地校验方法二 (时间判断)

    有些工具可能用的不是上面那个票据,而是通过内存修改器或者之前本应用的真实票据进行校验,此时通过bid校验则不能有效的进行过滤。此时考虑使用时间判断,进行过滤:

    首先在购买请求之前记录请求时间在本地,当票据校验完成之后,进行本地校验,如果票据中的时间purchase_date小于付费购买前注册的时间,则本票据生成时间不合法,也肯定是伪造的,此时可进行过滤和封号处理。

    其次,针对交易ID,需要进行判重:transaction_id,如果交易ID以及处理过,则不再进行再次处理。

    苹果内付费还是有很多安全方面的过滤可以做,有待加强。

  • 相关阅读:
    Elastic的should + bool 多字段完全匹配或查找
    MySQL慢日志
    Elastic的IN查找
    Elastic的字符串查找
    JavaScript获取当前时间戳
    原码, 反码, 补码学习笔记
    PHP渲染压缩HTML
    JavaScript的深拷贝
    JavaScript的变量的let const var的区别
    关于一个值该不该default null的判定
  • 原文地址:https://www.cnblogs.com/Buggo/p/5550047.html
Copyright © 2011-2022 走看看