AppleのVerificationController.mの例を実装した場合でも、サーバー側のレシート検証を行う必要がありますか?また、サーバー側を行う場合は、デバイスからAppleのサーバーに接続していないため、VerificationController.mを実装する理由はないようです。
最良の場合、自分のhttpsサーバーを実行するための優れた方法がないため、VerificationController.mのみを実装したいと思います。それで十分?アプリはiOS5以降で動作します
AppleのVerificationController.mの例を実装した場合でも、サーバー側のレシート検証を行う必要がありますか?また、サーバー側を行う場合は、デバイスからAppleのサーバーに接続していないため、VerificationController.mを実装する理由はないようです。
最良の場合、自分のhttpsサーバーを実行するための優れた方法がないため、VerificationController.mのみを実装したいと思います。それで十分?アプリはiOS5以降で動作します
これは見た目よりもややこしいので、おそらく微妙に間違っていると思いますが、次のようになります。
元の攻撃は、iOS ≤ 5.x の 2 つの弱点に依存しています。
これにより、ユーザー/攻撃者は App Store サーバーになりすまして、他人の購入に対する有効な領収書を提示することができます。
VerificationController は最初の弱点を修正できません (StoreKit が Apple と通信する方法を変更できません)。ほとんどの場合、2番目を修正するだけです。また、必要以上に多くのことをチェックしているように見えます (ただし、ここでは明らかに間違っている可能性があります)。これには、おそらく StoreKit が既にチェックしている一連のものが含まれます。
クライアント側の検証では、誰かがクライアントをハッキングするのを防ぐことはできません。これは、ジェイルブレイクされた電話では非常に簡単です. 購入したものが同じように簡単にハッキングされる可能性がある場合 (ゲームの弾薬/広告をオフにするなど)、これは実際には問題ではありません。
サーバーが購入するものを提供する場合は、サーバー側の検証が望ましいです (DLC/Skype クレジット/FarmCoins など)。
通常、領収書を購入した商品に変換する時点で検証を行います。
ただし、VerificationController にはいくつかの問題があります。
//Validation suceeded. Unlock content here.
、貧弱な 3G 接続で簡単に発生する可能性があります. これは、非消費型トランザクション (復元されたトランザクションは新しいトランザクション ID を取得すると思います) では問題にならないかもしれませんが、消費型は永久に失われることを意味します。-[SKPaymentQueue finishTransaction:]
受信確認が成功するまで呼び出しを延期できますが、これにより未完了のトランザクションがキューに残されます。ユーザーに請求することなく最終的に期限切れになることを願っています。-connection:didReceiveData:
がすべての応答データを返すことを前提としています。これは、サーバーと NSURLConnection の実装の詳細に当てはまる場合がありますが、これに依存するのは賢明ではありません。