在应用结算订单ID并安全验证订单

时间:2016-05-22 08:54:54

标签: android in-app-purchase in-app-billing

我几个月前发布了一个免费的Android应用程序,其中包含In App Billing,您可以购买耐用产品。在编码计费部分时,我没有注意订单验证,实际上我在购买完成时使用了代码:

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result, Purchase purchase) {

            if (mHelper == null) return;

            if (result.isFailure() && result.getResponse() == 7) {
                // Already bought
            } else if (result.isFailure()) {
                return;
            }

            if(purchase != null)
            {
                // add premium features
            }
        }
    };

我知道这不是一个安全的检查。

第一个问题。现在,我可以通过Google分析看到我获得了两种orderID类型的交易:

  • GPA.XXXX-XXXX-XXXX-XXXXX

  • [19位]。[16位]

据我所知,第二个在大约2年前被弃用(link),为什么我仍然收到订单ID?此外,第一种类型的所有订单都在Google Merchant Console中可见,而第二种订单则不可见。 如果相关的orderID是第二个,那么添加检查购买的应用启动检查是否安全并停用高级功能?

第二个问题。假设它可能是一个黑客并且还假设我认为不值得执行服务器端检查,那么当我实现verifyDeveloperPayload时会更安全购买? 据我所知,流通中的大多数黑客(如Freeedom)都不会欺骗developerPayload,这是在运行时根据Google帐户ID计算的,所以它应该足够了。

1 个答案:

答案 0 :(得分:1)

我回答了我自己的问题,因为没有其他人这样做,我收集了更多有关此事的信息。

关于第一个问题:如果您收到旧格式的订单ID,只需丢弃它们,因为它们很可能来自Lucky Patcher和其他试图欺骗订单的类似工具。

关于第二个问题:以上引用的大多数工具,欺骗开发人员有效负载并在响应JSON中重播它,所以不要相信它。

最后,实施服务器端验证肯定会保护您的应用程序免受IAB攻击。当然,他们仍然可以反编译并删除服务器检查,但你们都已经知道了这个故事。