セキュリティの向上

AIR セキュリティモデルは、開発者の制御下にないデータに対してシステム API を公開することに関連するリスクを軽減しながら、Ajax モデルとの後方互換性を実現することを目指しています。ブラウザーのクライアントサーバーモデルでは、ブラウザーがプレゼンテーションの大半および動的なサードパーティデータの読み込みの一部を処理しています。 サーバーは、機密性の高い処理の多くを実行し、記憶領域や暗号化などの OS に似た機能を提供します。 間接的に公開された関数を通じてやり取りする 2 つのサンドボックスを用意することによって、Adobe AIR では攻撃者がエンドユーザーのコンピューターやデータにアクセスする可能性を低くしています。

Ajax フレームワークの利用

非アプリケーションサンドボックスは事実上 HTML ブラウザーサンドボックスなので、Ajax 開発者は既存のアプリケーションおよびパターンを比較的容易に AIR に移植できることがわかるはずです。 例えば、Web から既存のクロスワードゲームを入手して、そっくりそのまま非アプリケーションサンドボックスのフレームに挿入できます。

非アプリケーションサンドボックスで実行されている Ajax フレームワークは、Web ブラウザーで実行される場合とまったく同じように実行されますが、フレームワークのバージョンによっては、 eval() やクロスドメインのコード読み込みを利用する場合に、アプリケーションサンドボックスでは完全には機能しない可能性があります。これは、主に、特定のフレームワークが eval() やこれに類似する動作にどの程度依存しているか、および開発者がフレームワークのどの部分を使用しているかによって決まります。

これらの制限で回避されないのは、JSON オブジェクトリテラルを含む eval() の使用です。これによってアプリケーションコンテンツで、JSON JavaScript ライブラリを使用できます。 ただし、アプリケーションサンドボックスコンテンツで、オーバーロードされた JSON コード(イベントハンドラーを含む)を使用することは制限されます。 その他の Ajax フレームワークおよび JavaScript コードライブラリの場合は、フレームワークまたはライブラリ内のコードが動的に生成されたコードに関するこれらの制限内で機能しているかどうかを確認します。制限に従っていない場合は、フレームワークまたはライブラリを使用するコンテンツを非アプリケーションセキュリティサンドボックスに含める必要があります。

アプリケーションの移行

単純なクロスワードゲームを使用して、 saveGame() および loadGame() などの関数を実装するには、どうすればよいでしょうか。そのためには AIR API にアクセスする必要があり、関連 API をアプリケーションサンドボックスに実装します。 アプリケーションサンドボックス内の関数およびデータは、サンドボックスブリッジを通じて非アプリケーションサンドボックスに公開されます。 このプロセスには以下の手順が含まれます。

  1. 元のルートコンテンツファイルの名前を someName.htm に変更します。

  2. myRoot.htm という名前のファイルを作成し、 someName.htm を指す IFRAME または FRAME を含めます。

  3. AIR API を呼び出す関数を作成します。 API を直接呼び出さない方が安全です。

  4. アプリケーションサンドボックスの機能を非アプリケーションサンドボックスに公開する parentSandboxBridge を作成します。

    2 つのサンドボックス間の通信は双方向です。 parentSandboxBridge childSandboxBridge によって、ブリッジでの双方向のやり取りが可能になります。これによって、開発者はアプリケーションとアプリケーション環境の間でのコンテンツフローをより細かく制御できます。

実際の使用例

Signet(del.icio.us ユーザー用のブックマークマネージャー)は、次のように AIR セキュリティモデルを実装した HTML ベースの AIR アプリケーションです。

  1. 最初に、id が signetFrame のフレームと利用可能なドメインを識別するために必要な 3 つの属性を含む、 SignetRoot.htm が作成されます。

  2. SignetRoot.htm で、 onload が、公開されるすべての関数を含む SignetBridge.js を呼び出します。

  3. SignetBridge.js では、 parentSandboxBridge を通じて signetFrame に関数が公開されます。

  4. Signet.js で、公開された関数が直接 AIR API を呼び出します。例えば、 writeRscContentPriv writeRscContent を呼び出します。

    この手法は比較的に単純ですが、効果は絶大です。2 つのサンドボックス用にリモートドメインとローカルドメインが定義され、onload の処理中にブリッジが呼び出され、ブリッジ API を通じて、仲介関数によって API が間接的に実行されます。