我几个月前发布了一个免费的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计算的,所以它应该足够了。
答案 0 :(得分:1)
我回答了我自己的问题,因为没有其他人这样做,我收集了更多有关此事的信息。
关于第一个问题:如果您收到旧格式的订单ID,只需丢弃它们,因为它们很可能来自Lucky Patcher和其他试图欺骗订单的类似工具。
关于第二个问题:以上引用的大多数工具,还欺骗开发人员有效负载并在响应JSON中重播它,所以不要相信它。
最后,实施服务器端验证肯定会保护您的应用程序免受IAB攻击。当然,他们仍然可以反编译并删除服务器检查,但你们都已经知道了这个故事。