OpenSocial 周りの調査をしていると、Caja という言葉に遭遇します。セキュアな JavaScript を実現するもの、ということだけ分かっていたのですが、詳細を調べてみました。

クロスサイトスクリプティングとブログパーツ #

goo や livedoor、fc2 などのホスティングを含めたブログサービスを使ったことのある方はご存知と思いますが、サービスによってブログパーツが貼れるもの、貼れないもの、一部だけ許可しているものがあります。なぜでしょうか?

Cookie には同一ドメインから実行されたスクリプトしか参照できないという特徴があります。これを利用して、Cookie をセッション情報や閲覧履歴の保存場所として活用しているサービスは少なくありません。上記ブログサービスがブログパーツを許可しないのは、これらの情報を悪意のある JavaScript から守るためです。逆に言うと、同一ドメイン上で JavaScript が実行できれば、そのセッション情報や閲覧履歴を盗むことができてしまいます。これを XSS(クロスサイトスクリプティング)と言います。

XSS が発生するのは、投稿フォームを使って、そのドメイン上のページに JavaScript を埋め込み、実行できるケースが挙げられますが、ブログパーツが貼れること自体も JavaScript が埋め込めるという意味では同じであり、まともに作られたサイトであれば、まずこういったことは出来ません。

とはいえ、実際にブログパーツを貼付けることができるブログは存在しますし、セキュリティの問題を回避しつつこれを実現するためのアプローチがいくつか存在します。

JavaScript を貼付けるためのアプローチ #

ドメインを分ける #

ブログを表示するドメインをセッション情報等のクリティカルな Cookie を保存していないものにしてしまいます。盗むものがなければ、泥棒が入ったところで何も困ることはありません。このアプローチをとっているものには livedoor ブログが挙げられます。

安全性の確認できた JavaScript のみ許可する #

サービス提供者が安全なブログパーツのリストを作り、ブログ管理者がそこから選ぶ、というアプローチです。ブログパーツの選択肢が狭くなるためユーザーには好まれませんが、全く貼れないよりはよいはず。goo ブログやはてなダイアリがこのアプローチをとっています。

iframe で表示する #

iframe 内に別ドメインで表示してしまえば、上記「ドメインを分ける」と同様に扱うことができます。このアプローチを取っているものに iGoogle が挙げられます。iGoogle はブログではありませんが、ブログパーツ=ガジェットと捉えれば同じ問題を扱っていると言えます。

JavaScript の危険な部分を無力化する #

サーバーが JavaScript を出力する前に危険な部分を書き換え、無力化してしまいます。このアプローチをとっているブログがあるか知りませんが、やり方としては誰でも思いつくのではないでしょうか。ただ、これを実現するためには膨大な労力と知識が必要となります。これがオープンソースで存在しているとすれば、どんなに素晴らしいでしょう。そして、これを実現することができるのが今回紹介する、Caja です。

Caja で実現できること #

Caja はカハと読みます。Caja は Google のオープンソースプロジェクトの名前で、これを使うことで、同一ドメイン上のページに安全に外部の JavaScript を貼付けることが可能になります。

Caja 紹介(日本語訳)

開発に当たって Caja を使って防がれるべきとされた攻撃方法の一覧

どこで Caja を使うのか #

Caja は OpenSocial コンテナ上での利用を想定して作られているようです。Caja 紹介 (日本語訳)の説明も、Shindig でアプリケーションを利用することが前提となっており、Caja を使ってガジェットをインラインで表示した方がパフォーマンスが向上する旨が記載されています。

Caja の形態 #

実はここがまだ調べきれていない部分なのですが、どうやら Java によるサーバーサイドでのリライトと、JavaScript のライブラリで構成されている、ぽいです。この辺はもう少し調べる必要がありそうです。

何か他に情報をお持ちの方がいらっしゃいましたらぜひ、教えてください。