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 のライブラリで構成されている、ぽいです。この辺はもう 少し調べる必要がありそうです。

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