リモートドメインから Flash (AS3) を使用して Flex SWF を呼び出す方法

Flash と Flex を使ったことがある方なら、異なるドメインから SWF ファイルを呼び出そうとしたときに遭遇する嫌な SecurityError に出くわしたことがあるかもしれません。このエラー、特に Error #2119 は、アプリケーション開発の道のりにおいて障害となり、異なるドメインにホストされた SWF とのシームレスな相互作用を妨げることがあります。今日は、この問題を掘り下げ、ActionScript 3 (AS3) を使用してどのように効果的に対処できるかを探っていきます。

問題: セキュリティサンドボックス違反

例えば、あるドメインにホストされた Flex SWF(たとえば http://www.a.com/a.swf)があり、別のドメインから異なる SWF(http://services.nuconomy.com/n.swf)を読み込みたいとします。あなたのコードは次のようになるかもしれません:

_loader = new Loader();
var req:URLRequest = new URLRequest("http://services.nuconomy.com/n.swf");
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaderFinish);
_loader.load(req);

しかし、実行すると次の例外が発生します:

SecurityError: Error #2119: Security sandbox violation: caller http://localhost.service:1234/flashTest/Main.swf cannot access LoaderInfo.applicationDomain owned by http://www.b.com/b.swf.

このエラーは、Flash Player が異なるドメインから提供される SWF ファイルの直接相互作用を防ぐセキュリティサンドボックス制限を施行しているために発生します。

解決策: Security.allowDomain() でアクセスを許可する

クロスドメインアクセスを許可するためには、ActionScript の Security.allowDomain() メソッドを使用して明示的に権限を付与する必要があります。以下は、このソリューションを効果的に設定する方法です:

ステップ 1: 読み込もうとしている SWF を修正する

読み込もうとしている SWF ファイル(http://services.nuconomy.com/n.swf と呼ぶことにします)に、次のコードスニペットを含める必要があります:

import flash.system.Security;

// この SWF と相互作用するドメインを許可
Security.allowDomain("http://localhost.service:1234");

ステップ 2: Security.allowDomain() を正しく実装する

  • 複数のドメイン: アプリケーションが異なるドメインからのアクセスを許可する必要がある場合、各ドメインについて Security.allowDomain() を複数回呼び出すことができます。
  • ベストプラクティス: allowDomain() を広範囲に使用すると、SWF ファイルがセキュリティ上の脆弱性にさらされる可能性があるため、注意が必要です。信頼できるドメインだけを許可してください。

ステップ 3: 設定をテストする

SWF コードを更新した後、アプリケーションを再度実行できます。すべてが正しく設定されていれば、リモート SWF からクラスを読み込むことができ、セキュリティ違反を引き起こすことはないはずです。

追加リソース

さらに理解を深めるためには、Adobe の Flash におけるセキュリティに関する広範なドキュメントを参照してください。特に、Flash Player のセキュリティとクロススクリプティングに関する第27章をカバーしている The Adobe Flex 3 Programming ActionScript 3 PDF をチェックしてください。

結論

セキュリティサンドボックス違反に遭遇することは、特にアプリケーションの機能性を向上させる機能を実装しようとしているときにはフラストレーションの元になります。しかし、Security.allowDomain() メソッドを使用すれば、これらの制限を簡単に回避し、異なるドメインからの SWF とのシームレスな通信を可能にすることができます。注意深く実装し、信頼できるドメインにのみアクセスを許可すれば、成功する統合への道が開けるでしょう。

安全なコーディングプラクティスは、接続された環境におけるアプリケーションの整合性を維持するために不可欠であることを忘れないでください。