目次


Dojo を使ってセキュアなマッシュアップを作成する

Comments

マッシュアップという用語は、2 つ以上の曲を合わせて新しい曲を作る手法を表す言葉として、一般に使われています。Web アプリケーションの場合のマッシュアップは、既存の UI 成果物やプロセス、サービス、データを組み合わせ、新しい Web ページやアプリケーションなどを作成する手法を表します。マッシュアップの手法は、多種多様な一般消費者向けメディア環境やソーシャル・メディア環境で使われています。

マッシュアップの手法では、再利用可能な UI 要素や疎結合のサービスを利用して、新しい Web ページやアプリケーションを迅速に作成することができます。また、アジャイルで動的な開発環境が作られるため、あまり技術スキルがないユーザーでも、強力で有用な Web ページやアプリケーションを作成することができます。ほとんどのマッシュアップは、高級マークアップ言語や高級スクリプト言語 (HTML コードや JacaScript コードなど) を使って既存の UI 成果物を組み合わせることで実装されています。

マッシュアップ開発が直面する脅威

マッシュアップ開発モデルにはオープンな環境が導入され、それによって新たなセキュリティー脅威が発生するため、開発者にとってセキュリティーが一番の懸念事項になります。マッシュアップ・ページは、さらなるマッシュアップを行うための、成果物あるいはデータ・ソースとして使われる場合もあるため、作成したマッシュアップがそれ以降どのように使用されるかを正確に予測することは不可能です。つまり開発者にとって、開発ライフサイクル全体をとおしてセキュリティーの問題に対応することが非常に重要です。

マッシュアップ開発モデルにおけるセキュリティー・リスクの増大に対応するためには、新たな手段を講じる必要があります。従来のセキュリティー手段 (DMZ やファイアーウォール) では、マッシュアップの UI 成果物やデータに必要なきめ細かなアクセスに対応することはできません。マッシュアップ・アプリケーションや Web ページは従来からのセキュリティーの脅威に対処する必要があるだけではなく、何よりもクロスサイト・スクリプティング (XSS) やクロスサイト・リクエスト・フォージェリー (CSRF) などの問題にも対応しなければなりません。

クロスサイト・スクリプティング

賢明なハッカーは、貧弱なセッション管理を悪用することができます。その一例が、新しいユーザーがログイン・ページにリダイレクトされた時点、さらにはそのユーザーがログイン・ページにクレデンシャルを入力している最中に、既存のユーザーとサーバーとのセッションが既にアクティブになっている、といった状況を悪用するケースです。このケースでは、サーバーはその新しいユーザーとのセッションは既にアクティブであると信じ、そのユーザーに対し、まったく新しいセッションが作成されていてクレデンシャルも正常に保存されていることを示すレスポンスを返します。この時点で、既存のセッションを隠れて所有しているハッカーは、そのセッションがアクティブであり続ける限り、その新しいユーザーとサーバーとの間でやりとりされたデータを記録して悪用することができます。攻撃者はよく XSS の手法を使用してブラウザーの保護手段を回避し、サードパーティーのサイトにデータをリダイレクトして記録します。

クロスサイト・リクエスト・フォージェリー

CSRF 攻撃が行われる間、侵入者であるサードパーティーのサイトから発行されたリクエストは、認証済みのブラウザー・ページを介してサーバーに送信されます。そしてレスポンスは侵入者のサイトに返されます。典型的なセキュリティー・メカニズムでは、認証済みのセッションがいったん確立されると、認証済みのブラウザーからサーバーへのその後のリクエストはすべて有効であると見なします。従って、認証済みのブラウザーを侵入者のサイトが操作し、そのブラウザーとサーバーとの間でリクエストとレスポンスを交換できるようになると、侵入者のサイトは認証済みのブラウザーと同じアクセス権を持つことになり、個人の情報が漏れてしまいます。ブラウザーの同一生成元ポリシーでは CSRF 攻撃を防ぐことはできません。攻撃のリクエストは、侵入者であるサードパーティーのサイトの代理によって、同じ生成元に送信されるからです。

Dojo を理解する

Dojo ツールキット (詳細は「参考文献」を参照) は、API (Application Programming Interface)、スキン、ウィジェットから成るオープンソースの JavaScript フレームワークです。Dojo ツールキットを使用することで、JavaScript コード、HTML、CSS、Ajax を使ってアプリケーションや Web サイトを構築することができます。Dojo ツールキットは、チャート、アニメーション、階層ツリー、カレンダー、メニュー、その他の要素で構成されています。どのブラウザーでも動作する Ajax 開発のために、Dojo は XMLHttpRequest (XHR) オブジェクトを抽象化するためのレイヤーを提供しています。

Dojo は階層構造のパッケージ・システムで構成されているため、Dojo を利用すると、名前空間を使ってモジュール開発を行うことができます。そのおかげで、サードパーティーのライブラリーやアプリケーションでは、Dojo の機能を拡張してもオブジェクト名や関数名が重複することはありません。また、Dojo のパッケージは 1 つ以上のファイルで構成されており、それらのファイルが他のファイルに依存している場合もあります。

Dojo には、プロファイルを作成するためのメカニズムも用意されています (プロファイルは、ロード、初期化、キャッシングを統一的に行うために組み合わされた一連のパッケージです)。プロファイルを使用することで、Apache Ant などのシステムは、プロファイルの中で指定されたパッケージや依存関係を含む、圧縮された 1 つの JavaScript ファイルを作成することができます。一部の一般的な用途には、あらかじめ作成されているプロファイルもあります。

Dojo によって CSRF から保護する

一般に、CSRF 攻撃を防ぐには、一意のトークンやクッキーをリクエストごとに渡すようにするという方法を採ることができますが、それと同様のことを Dojo で行うこともできます。XHR リクエストはすべて dojo.xhr() 呼び出しによってルーティングされるため、この呼び出しを変更してヘッダーを 1 つ追加で含めるようにし、このヘッダーを一意のトークンとして使用することができます (リスト 1)。

リスト 1. XHR リクエストを変更してヘッダーを 1 つ追加で含める
var originalXHR = dojo.xhr;
dojo.xhr = function(httpVerb, xhrArgs, hasHTTPBody)
{
  // Use the session ID (JSESSIONID for Java, PHPSESSID for PHP)
  // as the token value
  args.headers["Request-Token"] = dojo.cookie("JSESSIONID");
  return originalXHR(httpVerb, xhrArgs, hasHTTPBody);
}

このコードによって、サーバーはすべてのリクエストをチェックし、Request-Token ヘッダーがあること、そして Request-Token ヘッダーがセッション ID と同じ値を持っていることを確認します。サーバーは、Request-Token ヘッダーの値が正しくないリクエストはすべて CSRF 攻撃の試みと見なし、それらのリクエストを拒否します。

DojoX Secure

DojoX は Dojo ツールキットの拡張機能によるフレームワークであり、コード・リポジトリーとして、あるいは試験的なコードのインキュベーターとして、また他のツールキットの拡張機能に対するテスト環境として機能します。

DojoX Secure は DojoX フレームワークのツールおよびサブプロジェクトを集めたものであり、悪意のある可能性があるデータやコードを扱うことで生じるセキュリティー上の問題に対処することを目的としています。DojoX Secure には以下の 3 つの主なパッケージがあります。

  • dojox.secure.sandbox パッケージは、XHR オブジェクトを使って JSON データ、Web ページ、スクリプトを外部ドメインから安全にロードするための機能やツールを提供します。dojox.secure.sandbox パッケージにより、ブラウザーの DOM のためのサンドボックス環境を提供することができ、ブラウザーの DOM を悪意のある操作から保護することができます。
  • dojox.secure.capability パッケージは JavaScript を検証します。この検証の後、サンドボックス環境外部の JavaScript オブジェクトに対し、スクリプトによってアクセスしたり変更を行ったりできるようになります。
  • dojox.secure.DOM パッケージは、ブラウザーの DOM の指定されたブランチの部分のみにアクセスを制限します。

DojoX Secure には、悪意のある可能性があるコード、コンテンツ、UI 成果物を外部ドメインから安全にロードする上で必要なコンポーネントが含まれています。また DojoX Secure によって、スクリプトを実行しても安全であることが保証され、また DOM のアクセスや変更を制御するためのサンドボックスが提供されることになります。こうした機能から、DojoX Secure はセキュアなマッシュアップを構築するための貴重な支援ツールとなります。

以下のセクションでは、dojox.secure パッケージを使ってマッシュアップのセキュリティー脅威の特定なものに対抗する方法について説明します。

ドメインにまたがってリソースをロードする

DojoX Secure は DojoX の XHR プラグイン・レジストリー・フレームワークを使用して、ドメインにまたがる複数のサイトからリソースを取得します。このトランスポート・フレームワークは、新興の技術 (例えば Windows® Internet Explorer® バージョン 8 の XDomainRequest オブジェクトや、W3C の Cross-Origin Resource Sharing 仕様など) をサポートすることで、そうしたリソースへのアクセスを実現しています。こうした新興技術の 1 つまたは複数に対してブラウザーが標準化されるまで、その代わりとなる手段が必要です。DojoX は今すぐ使用できる 2 つのトランスポート・プラグインを提供しており、ドメインにまたがるリソースに対し、これらのプラグインを使って容易にアクセスすることができます。

  • プロキシー・サーバー・トランスポート・プラグインは、本来のドメインにあるプロキシー・サーバー・サービスを利用します。本来のドメインのプロキシー・サーバー・サービスが実行されている場合、外部ドメインからリソースを要求することができ、そのためには xhrPlugins オブジェクトの addProxy 関数のパラメーターとして、その外部ドメインを指定します。例えば下記のスニペットは、プロキシー・サーバー・サービスにリクエストを送信して example.com に接続し、someresource という名前のリソースを取得する方法を示しています。

    dojox.io.xhrPlugins.addProxy("/proxy?url=http://example.com/someresource");
  • window.name トランスポート・プラグインは、window.name プロトコルをサポートする Web ページやアプリケーションに使用することができます。このプロトコルによって iframe が作成され、iframe の名前は取得対象のデータに設定されます (例えば myiframe.contentWindow.name = "This is some data" など)。するとメインの HTML ファイルによって myiframe.contentWindow.name の値を取得することができます。example.com から window.name プロトコルを使ってリソースをロードする必要があると定義するためには、example.com サイトを下記のように登録します。

    dojox.io.xhrWindowNamePlugin("http://example.com");

リソースを取得するためのトランスポート・メカニズムを定義したら、リソースのロード先となるサンドボックスを作成します。

サンドボックスを使う

DojoX Secure を使ってサンドボックスを作成するためには、以下の 2 つのステップが必要です。

  1. サンドボックスとして使われる DOM 要素を定義します。この要素は単純で標準的な <div> 宣言でも構いません。
    <div id="mySandbox"></div>
  2. サンドボックスを作成します。このステップのためには、下記のような 1 行の DojoX 関数を呼び出し、<div> 要素の中にある ID をパラメーターとして渡します。
    var mySandbox = dojox.secure.sandbox(dojo.byId("mySandbox"));

これでサンドボックスが作成できたので、下記のように loadHTML 関数を使って HTML スニペットをサンドボックスにロードします。

mySandbox.loadHTML("http://example.com/snippet.html");

loadHTML 関数は指定の URL から HTML スニペットをロードし、サンドボックス化された DOM 要素に注入します。HTML スニペットにスクリプト・コードが含まれている場合には、そのスクリプトもサンドボックス化されます。

また、下記のように loadJS 関数を呼び出し、JavaScript ファイルをサンドボックスにロードして実行することもできます。

var result = mySandbox.loadJS("http://example.com/snippet.js");

loadJS 関数は、指定された JavaScript ファイルの内容をロードします。JavaScript コードは、まず安全かどうか検証され、それからサンドボックスの中で実行されます。サンドボックスという制限により、ロードされて実行されるコードは、サンドボックス化された DOM 要素と、その DOM 要素の子ノードのみです。dojox.secure によるサンドボックスのメカニズムを図 1 に示します。

図 1. DojoX Secure のサンドボックス
DojoX Secure のサンドボックスは JavaScript コードを安全に実行するための場所を提供します
DojoX Secure のサンドボックスは JavaScript コードを安全に実行するための場所を提供します

サンドボックスの中で作成された有効な値やオブジェクト (loadJS を呼び出した結果など) はすべて、メインの文書の JavaScript 環境にアクセスすることができます。そのため、メインの文書とサンドボックス環境とのやり取りが容易になります。

セキュアな環境を提供するために、標準的な JavaScript 機能の一部 (例えば、eval() の使用、グローバル変数へのアクセスの制限、[] 演算子の使用、<link> タグの宣言など) は、利用できなくなるか、あるいは DojoX Secure のサンドボックス環境内のみでの使用に制限されます。

サンドボックス化されたリソースをロードできる機能の他にも、DojoX Secure はサンドボックス化された UI 成果物を作成するために使える機能も提供しています。

セキュアな UI 成果物を作成する

DojoX Secure のサンドボックス化されたスクリプトはサンドボックス化された要素にアクセスすることができるため、サンドボックス化された要素に対し、直接 DOM 要素を作成したり操作したりすることができます。サンドボックス化された要素の子要素とノードのみに DOM 操作を制限することで、ブラウザーの DOM をサンドボックスの中でセキュアに操作することができます。

リスト 2 は、DojoX Secure のサンドボックスの中で作成できる単純な UI 成果物を示しています。

リスト 2. サンドボックス化された成果物
<div id="mySandbox">
  <script type="text/javascript">
    var widget = document.createElement('div');
    widget.setAttribute('id', 'testwidget');
  
    widget.style.width = 300;
    widget.style.height = 300;
    widget.style.background = "#0f0";
    widget.style.border = "4px solid #000";
  
    widget.innerHTML = "This is some data for the widget.";
    document.getElementById("mySandbox").appendChild(widget);
  </script>
</div>

リスト 2 に示した機能は、本来のドメインの中で動的に作成され、ロードされた UI 成果物を示しています。ただし、UI 成果物は他のドメインからも同じように容易に作成したりロードしたりすることができます。このコードを基に、DojoX Secure のサンドボックスの中で使用するための UI 成果物を作成して、セキュアにロードおよび実行することができます。

まとめ

マッシュアップでは、高級スクリプト言語を使って既存の成果物をリサイクルして再利用し、新しい UI を作成することができます。またマッシュアップでは、複雑なプログラミングもミドルウェア技術も必要としないさまざまなセマンティクスのデータ・フォーマットを使用して、まったく異質のデータを素早く容易に統合することができます。

マッシュアップ開発ではオープンな開発モデルを使用しますが、このモデルの欠点として、マッシュアップ・アプリケーションを開発する際にはセキュリティーが大きな懸念事項になります。マッシュアップ・ページは別のマッシュアップのソースとして使われる場合もあるため、マッシュアップの成果物やページ、データ・ソースが将来どのように使用されるかを正確に予測することは困難です。どのマッシュアップからも別のマッシュアップが作成される可能性があることから、プロセス全体にわたってセキュリティーに対応することが不可欠となります。

DojoX Secure の JavaScript フレームワークを利用すると、セキュアなマッシュアップの作成において高度なことができるようになります。また、DojoX Secure の API、ツール、サブプロジェクトを使用すれば、サンドボックス環境でリソースをロードしてスクリプトを実行することもできます。また DojoX Secure では、そのサンドボックス環境の中でブラウザーの DOM を操作することもできるため、UI 成果物をセキュアに開発し、デプロイすることができます。

この記事で説明した概念や詳細事項は、dojox.secure フレームワークを使って開発することでマッシュアップのセキュリティー脅威を回避する手法について、継続的に話題になっている内容によるものです。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Web development
ArticleID=516880
ArticleTitle=Dojo を使ってセキュアなマッシュアップを作成する
publish-date=08032010