金利0無利息キャッシング – キャッシングできます

 | 

2009-10-26

外部サーバーと連携するOpenSocialアプリケーションを作る際のごく一般的な注意事項

04:15 | 外部サーバーと連携するOpenSocialアプリケーションを作る際のごく一般的な注意事項 - 金利0無利息キャッシング – キャッシングできます を含むブックマーク はてなブックマーク - 外部サーバーと連携するOpenSocialアプリケーションを作る際のごく一般的な注意事項 - 金利0無利息キャッシング – キャッシングできます

特定のアプリケーション脆弱性の指摘とかではなく一般論として手短に書きます。外部サーバーと連携するようなOpenSocialアプリを作る際に、ユーザーから送られてきたデータを信頼してはいけません。特にアプリケーション内で「自分が誰であるか」を取得して、それをパラメータとして外部サーバーに送信するようなケースでは注意が必要です。

そのようなケースでは、署名による認証つきのリクエストを使うべきです。 → 署名の検証方法書いた http://subtech.g.hatena.ne.jp/mala/20091028/1256710692

http://code.google.com/intl/ja/apis/opensocial/docs/0.8/reference/gadgets/#gadgets.io.makeRequest

opt_params[gadgets.io.RequestParameters.AUTHORIZATION] が gadgets.io.AuthorizationType.SIGNED に設定されると、コンテナは相手のサーバーに対してユーザーの身元を証明することが必要になります。そのためにコンテナでは、次のようにします。

このときにQUERY_STRINGに付加される、opensocial_viewer_idを使用するべきです。opensocial_viewer_idは閲覧者のidで、opensocial_owner_idは見てるページの所有者のidです。ガジェットタイプのアプリの場合だとviewerと異なることになるでしょう。

重要なことはブラウザ内で実行されているコードが改変されていないことを保障することは出来ない、ということです。これはウェブアプリケーションにおけるセキュリティの基本だと思います。こんな基本的なことが分かってなくても200万人が利用するアプリケーションは作れる!!!!

これは大事なことだと思うのでmixiは開発ガイドにでも書いておいたほうが良いと思われます。

それ以外のデータは信頼できない

例えばmixiアプリにおいて、OpenSocialJavaScript APIを利用して、マイミクの一覧を取得して、gadgets.io.makeRequestを使用して外部サーバーに送信するとします。この時に送られてくるマイミクの一覧は必ずしも正しいとは限りません。ユーザースクリプトデバッグ用のproxyなどで上書きされている可能性があります。

署名付きリクエストによって、確かにOpenSocialコンテナから送信されたリクエストであることと、コンテナが付加したopensocial_viewer_idなどのパラメータが正しいことは保障されていますが、ユーザーが生成したデータは必ずしも正しいとは限りません。Aさんが送ってきたマイミク一覧はあくまで「自称」のデータです。いくらでも書き換えられます。

AさんとBさんがマイミクであることを条件に何か特別な操作を可能にするようなアプリを作る場合は注意が必要になるでしょう。例えば、Aさんの申告してきたマイミク一覧と、Bさんの申告してきたマイミク一覧の双方を一定期間キャッシュしておいて照合することで、改変されている可能性を検出することが可能でしょう。が、確実ではないし面倒くさい。

サーバーサイドでの検証

どうにもならないのかというと、そういうわけでもないです。JavaScriptが使えないモバイル版の場合では。2-legged OAuthを使え、ということになってます。

http://developer.mixi.co.jp/appli/appli_mobile/lets_enjoy_making_mixiappmobile/2-legged-oauth

http://d.hatena.ne.jp/lyokato/20080819/1219116960

https://sites.google.com/site/oauthgoog/2leggedoauth/2opensocialrestapi

とても簡単に言うと、ユーザーによる承認画面をスキップしたOAuthです。JavaScriptAPIで取得できるのと同等のデータをサーバーサイドで取得することが出来ます。アプリ作成者がインストールしたユーザーのidをクエリに加えた上でOAuthのリクエストを出します。認可はアプリインストールした時点で許諾を得たと見なします。

クライアントサイドから送られるデータが信頼できないということが「アプリケーションの性質上、深刻な問題になる場合は」こういった方法でサーバーサイドでマイミクの一覧を受け取ったりすればいいんじゃないですかね。ただし、PC版の開発ガイドには2-legged OAuthには触れてませんし、使えるようになる予定かどうかも知りません。

終わり。

 |