その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

In-App Purchase の脆弱性への対応方法

巷を騒がせている In-App Purchase の脆弱性問題ですが、iOS Developer Library に対策方法についての記事が掲載されていました。


「自分とこのサーバーから App Store サーバーにレシート送ってチェックしているタイプのアプリはいいけど、そうじゃない場合は脆弱性の影響を受ける可能性がありますよ、次のように対策してくださいね」ということが書かれているのですが、

Check that the SSL certificate used to connect to the App Store server is an EV certificate.
Check that the information returned from validation matches the information in the SKPayment object.
Check that the receipt has a valid signature.
Check that new transactions have a unique transaction ID.

この記事には添付ファイルがついていて、そのあたりの実装をすでにやってくれている VerificationController なるクラスが入っています


VerificationController を用いた脆弱性対策の実装方法

VerificationController クラスはシングルトンとして実装されていて、sharedInstance 以外には verifyPurchase:というメソッドを一つもっているだけなので、中身はややこしいですが扱いやすいかと思います。


手順は以下の通りです。


1. VerificationController をダウンロード&プロジェクトに追加
https://developer.apple.com/library/ios/releasenotes/StoreKit/IAP_ReceiptValidation/VerificationController.zip


2. Security.framework をプロジェクトに追加


3. verifyPurchase: メソッドをコール
transactionState が SKPaymentTransactionStatePurchased または SKPaymentTransactionStateRestored になった場合に、verifyPurchase: メソッドをコールしてチェックを行います。


4. base64まわりのメソッドを実装
ビルドしてみると #warning が仕込まれていて気づくようになっているのですが、

  • encodeBase64:length:
  • decodeBase64:length:
  • base64_decode()
  • base64_decode()

の実装が空になっているので自分で実装する必要があります。


#base64 の Objective-C 実装は巷にたくさん転がっているものの、型とか引数とか微妙に違ってて、そのものズバリ、なものはなかなか見つかりませんでした。これはめんどくさい。。