以下の節では、サブディレクトリ内のクロスドメインポリシーファイル、メタポリシーの利用、ソケットポリシーファイルなど、より複雑なクロスドメインの実装について説明します。
loadPolicyFileメソッドの操作方法について詳しく知りたい場合は、Adobe LiveDocsのloadPolicyFileに関する説明を参照してください。
サブディレクトリからHTTPポリシーファイルを指定すると、そのディレクトリとそのすべてのサブディレクトリへのアクセスを定義できます。したがって、管理者は、サイトのルートディレクトリ内に非常に一般的なcrossdomain.xmlファイルを作成する代わりに、ユーザが各自のニーズに応じてサブディレクトリ内で独自のcrossdomain.xmlファイルを定義することを許可できます。例えば、開発者がdomain="*"を指定する必要がある場合、ルートのcrossdomain.xmlファイルでdomain="*"を指定する代わりにサブディレクトリのcrossdomain.xmlファイルでこのアクセス許可を指定すれば、そのディレクトリだけを公開することができます。この方法は、開発者が、パブリックWebサイトと通信するためにdomain="*"の設定を必要とするlocal-with-networking SWFファイルを作成する場合に便利です。サブディレクトリからホストされるcrossdomain.xmlファイルでは、ポートへのアクセスは定義できません。
サブディレクトリからポリシーファイルをロードする方法のコード例を次に示します。
//Load a policy file which allows cross-domain access to the ~user1 directory
System.security.loadPolicyFile("http://www.example.com/~user1/myPolicy.xml");
//Access data under the ~user1 directory
NetStream.play("http://www.example.com/~user1/vids/myVideo.flv");
開発者は、loadPolicyFileメソッドに使用するFlashVarをURLから取得することを避ける必要があります。攻撃者がFlashVarを制御できるようになると、loadPolicyFileメソッドを使用してクロスドメインのGET要求を実行し、任意のデータをリモートサイトに送信する可能性があります。これによって、不正な情報公開が行われたり、クロスサイトリクエストフォージェリ攻撃を受けたりする恐れがあります。FlashVarとして場所を受け入れる必要がある場合、開発者は、URLをloadPolicyFileメソッドに提供する前に、そのURLが承認されたホワイトリストに記載されていることを確認する手順を踏む必要があります。
メタポリシーについて詳しくは、セキュリティに関するFlash Player 9の変更点(バージョン9.0.115.0)についての記事のメタポリシーの節を参照してください。
多くの開発者にとって、システム上のユーザに各自のディレクトリに対するcrossdomain.xmlファイルの作成を許可するかどうかは、悩ましい問題です。場合によっては、システム管理者だけがクロスドメインのアクセス許可を定義できるようにする必要があります。Flash Player 9 Update 3から、Flash Playerでは、システム管理者がcrossdomain.xmlファイルの作成を許可するディレクトリを制限するためのコントロールを設定できるようになりました。 <site-control/>ディレクティブで指定されるそのようなオプションには、次のものがあります。
none-this-responseは、サーバ全体に対するメタポリシーを宣言するのではなく、1つのHTTP応答にのみ影響します。また、他のすべてのメタポリシーとは異なり、none-this-responseは他のメタポリシーと組み合わせて競合せずに使用できます。none-this-responseと他のメタポリシーの両方が存在する場合、現在のHTTP応答をポリシーファイルにすることはできませんが、それ以外のメタポリシーはサーバ全体に対するメタポリシーとして解釈されます。Content-Type: text/[x-]cross-domain-policyのポリシーファイルのみが許可されます。 管理者がこれらのコントロールを利用するには、Webのルートディレクトリに次の例のようなcrossdomain.xmlファイルを作成します。
<?xml version="1.0"?> <!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd"> <!-- Policy file for mysite.com --> <cross-domain-policy> <!—This is the only cross-domain policy file for this server --> <site-control permitted-cross-domain-policies="master-only"/> </cross-domain-policy>
メタポリシーの実装は、できるだけ多くのエンドユーザが使用できるように、Flash Player 7およびFlash Player 8にバックポートされる予定です。
この節で説明した内容についてさらに詳しく知りたい場合は、Adobe LiveDocsの次のページが役に立ちます。
ポリシーファイルは、checkPolicyFileプロパティを使用してチェックできます。NetStream、SoundLoaderContext、LoaderContextおよびHTMLテキスト領域のイメージタグには、checkPolicyFileプロパティがあります。このプロパティはLoader.load()メソッドには適用できますが、Loader.loadBytes()メソッドには適用できません。
イメージ(JPEG、GIFまたはPNG)をSWFファイルのドメイン外からロードし、そのイメージのコンテンツにActionScriptを使用してプログラムでアクセスする必要がある場合は、このプロパティをtrueに設定します。Flash Playerは、最初に既にダウンロードされているポリシーファイルを考慮し、次にSecurity.loadPolicyFile()メソッドの呼び出しで指定された保留中のポリシーファイルのダウンロードを試み、さらに、URLRequest.urlに対応するデフォルトの場所からポリシーファイルのダウンロードを試みます。これは、URLRequest.urlと同じサーバ上の/crossdomain.xmlです。
イメージコンテンツにアクセスする例としては、Bitmapオブジェクトを取得するためにLoader.contentプロパティを参照する場合や、ロードされたイメージのピクセルのコピーを取得するためにBitmapData.draw()メソッドを呼び出す場合などがあります。ロード時にcheckPolicyFileを指定せずにこれらの操作のいずれかを試行した場合、必要なポリシーファイルがまだロードされていないので、SecurityError例外が発生することがあります。
// Setting a Loader to check the policy files var ldr:Loader = new Loader(); var loader_context:LoaderContext = new LoaderContext() loader_context.checkPolicyFile = true; var url:String = "http://www.remote_example.com/content.swf"; var urlReq:URLRequest = new URLRequest(url); ldr.load(urlReq,loader_context); // Checking for a policy file by specifying "CheckPolicyFile" in an // image tag defined within a TextArea <img src = 'http://remote.server.org/filename.jpg' checkPolicyFile = 'true' id = 'instanceName' >
objectタグとembedタグのallowNetworkingパラメータがfalseに設定されている場合、SWFファイルはクロスドメインファイルをチェックできません。SWFがポリシーファイルを見つけられない場合は、データのロードが試行されたときにSecurityExceptionがスローされます。
この節では、ソケットポリシーファイルの概要について簡単に説明します。ソケットポリシーファイルについて詳しくは、セキュリティに関するFlash Player 9の変更点(バージョン9.0.115.0)についての記事のソケットポリシーファイルの節を参照してください。
ソケットポリシーファイルは、ドメインに対して許可されるソケット接続を定義します。 ソケットポリシーファイルは、ポート843で待機しているソケットポリシーファイルサーバか、目的の接続と同じポートでホストされる必要があります。このファイルは、クロスドメインファイルと同様に、ポリシーファイルが許可されるサーバ上の場所を定義するメタポリシーをサポートしています。使用できるメタポリシーは以下のとおりです。
<allow-access-from>ディレクティブがあっても無視されます。ソケットポリシーファイルは、HTTPポリシーファイルと同様のsecureフラグをサポートしています。<allow-access-from>ディレクティブ内でこのフラグを「true」に設定すると、HTTPS経由で提供されるSWFファイルのみに指定されたポートへの接続を許可するように、Flash Playerに指示できます。デフォルトでは、このフラグはfalseであると見なされます。 ソケットポリシーファイルは安全でないプロトコル経由で取得され、man-in-the-middle攻撃の標的となる可能性があるので、現時点ではリモートソケットにこのフラグを使用することはあまりお勧めできません。通信中に攻撃者がこのフラグの値を変更する可能性があります。このフラグは、man-in-the-middle攻撃を受ける可能性がほとんどない、localhost接続での使用に適しています。
ワイルドカードを使用してポートアクセスを定義する代わりに、Flash Playerでは、範囲とコンマを使用してポート番号のグループを指定できます。これにより、Flash Playerと無関係のポートをFlash Playerのソケットライブラリに誤って公開するリスクを減らすことができます。
// Use an XMLSocket request to port 843 in order to download a policy
// file allowing access to 456
System.security.loadPolicyFile("xmlsocket://socks.mysite.com:843");
// Connect to port 456
mySocket.connect("socks.mysite.com", 456);
// The crossdomain.xml file on port 123 allowing access to 456
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
<!-- Policy file for xmlsocket://socks.mysite.com -->
<cross-domain-policy>
<!-- This is a master-policy file -->
<site-control permitted-cross-domain-policies="master-only"/>
<!—Instead of setting to-ports="*", administrator's can use ranges and commas -->
<!—This will allow access to ports 123, 456, 457 and 458 -->
<allow-access-from domain="socks.mysite.com" to-ports="123,456-458" />
</cross-domain-policy>