Google

2012年9月9日日曜日

Unityでコインゲー開発:保存とセキュリティ

セーブロードの話の続き。

データ永続化って、それに対するセキュリティ対策も考えなくてはなりません。
Unityの難読化とは別に考えておく作業です。
まずコインゲームで一番問題となるのは言うまでもなく残枚数管理。
これが不正操作されれば商売になりません。

私が関わったのは大雑把に以下のケース。

 ・サーバと同期させて処理するタイプ
 ・内部だけで処理するタイプ

まあ、サーバ同期はサンプルソースも一切出せませんし、WWWクラスが隠蔽されすぎてて非常に使いづらいので、個人的にはあまりオススメできません。
どうしてもやるならネイティブコードで通信するほうがいいでしょう。
しかし内部だけでやる場合、まずデータそのものをどうにかしなければなりません。
素のまま保存されていたらジェイルブレイクで即解析ですから。

そこで先日書いたEasySave
このプラグインのクラスにはencryptOnというstatic変数があり、これを真にすると内部で暗号化を行ってくれます。
非常に簡単ですが負荷が掛かるので使う場所とデータ量には注意を。

で、コインゲーのもう一つの穴、時間経過でのコイン付与。
付与そのものの方法ですが、簡単に言うとこうやります。

 ・アプリがバックグラウンドに遷移した瞬間の日時を保存
 ・開始時に現在の日時と保存していた日時の差分秒数を出す
 ・1枚付与する秒数で割って、付与枚数を出す。
 ・無課金付与枚数の限界を超えないようにその枚数を加算する

あ、ズレがでないよう、日時は必ずGMTで保存しましょうね。
んで、無課金で可能な限り遊びたいと思うユーザはこんな操作をします。

 ・コインがなくなったらスマホの時間を戻す
 ・昔に戻した状態でアプリを起動して終わらせる
 ・時間を未来に進めて再度アプリを起動

何も対策してないと、時間が進んだと勘違いしてしまいますね。
不正と言い張ってもそういう動きをしてしまっては説得力もありません。

まあ、プログラムからこれを対策する方法は何種類もあって、実際は複数の手段を入れたりするんですが、今回はその対策手法のひとつをご紹介します。
私は過去フラグ方式と呼んでます。

 ・起動した際、前回の保存日時より過去なら不正フラグを立てて保存
 ・次の起動時、セーブデータに過去フラグがあったら不正とみなす
  →不正なのでコインは一切増やさない
 ・上記に該当しなければ不正フラグを戻して保存

この方法なら何度過去と未来を行き来してもコインは増えません。
また、時計を修正してもアプリを起動しなければ関係のない話でもあります。

しかしこれもビジネス。
色々やり過ぎて一般ユーザの不便さを取るより、ごく一部の違法ユーザは無視するという判断をすることが多いでしょう。


続きます。

0 件のコメント:

コメントを投稿