次の図表は、前の各セクションで説明したローカルセキュリティ権限をまとめたものです。
すべての SWF は、Flash Player にロードされるとサンドボックスに置かれます。図 5 は、SWF がそのロード元に応じてサンドボックスに割り当てられるしくみを示しています。a.com や b.com などのネットワークからロードされた SWF は常に、その元のドメインに対応するサンドボックスに置かれます。
図 5 SWF のソースに基づいたサンドボックスの割り当て
ローカルソース (ローカルファイルシステムや UNC ネットワークパス) からロードされた SWF は、3 つのサンドボックスのいずれかに置かれます。デフォルトでは、ローカル SWF は local-with-filesystem サンドボックスに置かれます。ネットワークへのアクセス権を必要とすることを宣言したローカルファイルは、local-with-networking サンドボックスに置かれます。設定マネージャまたは設定ファイルによって信頼性のあるファイルとして登録されたローカルファイルは、local-trusted サンドボックスに置かれます (Flash Player 7 以前は、すべてのローカルファイルが local-trusted サンドボックスに置かれていました)。
2 つの SWF が同じサンドボックス内にある場合、両者は自由にやり取りできます。以降の各図表では、異なるサンドボックス、ファイルシステム、およびサーバーに置かれている SWF 同士がやり取りするしくみについて説明します。
図 5 の矢印は、SWF のソースを表しています。以降の各図表では、矢印がアクセスの関係を表します。破線の矢印はデータのロードを表し、輪郭で示される矢印はクロススクリプティングを表します。図 6 は、デフォルトのサンドボックスに置かれる SWF の権限を示しています。
図 6 デフォルトのサンドボックス割り当てと、これらのサンドボックス内でデフォルトで適用される権限
デフォルトでは、ローカル SWF は local-with-filesystem サンドボックスに置かれます。このサンドボックス内の SWF は、たとえば XML.load() を使用して、ローカルファイルシステムや UNC ネットワークパスにあるファイルを読み取ることができますが、インターネットと通信することはできません。
リモート SWF に適用される権限は Flash Player 7 の場合と同じですが、リモート SWF がローカルコンテンツをロードできなくなった点が異なります。リモート SWF は常に、その元のドメインに対応するサンドボックスに置かれます。a.com サンドボックス内の SWF は、たとえば XML.load() を使用して、a.com サーバーからデータを読み取ったり、XML.send() などを使用してインターネット上のあらゆる場所にデータを送信したりすることができます。
図 7 は、リモート SWF にデフォルトでは適用されないが、アクセス許可を使用して与えられる権限を示しています。
図 7 アクセス許可によってリモート SWF に与えられる権限
a.com の SWF は、b.com のポリシーファイルが a.com またはすべてのドメインからのアクセスを許可している場合、XML.load などを使用して b.com サーバーのデータを読み取ることができます。a.com の SWF は、b.com の SWF が System.security.allowDomain("a.com") を呼び出した場合、b.com の SWF の ActionScript メソッドなどを呼び出して、b.com の SWF をクロススプリクティングすることができます。これらのアクセス許可は Flash Player 7 で可能であったもので、Flash Player 8 でも変更されていません。
デフォルトでは、リモート SWF はローカル SWF をクロススクリプティングできません。しかし、local-with-networking SWF および local-trusted SWF は、System.security.allowDomain() を使用して、リモート SWF によるクロススクリプティングを許可することができます。local-with-filesystem SWF は、このような許可を与えることができません。これは、この許可が可能な場合、local-with-filesystem SWF とリモート SWF が連携して、ローカルファイルシステムのデータを読み取り、そのデータを Web サーバーに送ることができてしまうためです。
図 8 は、local-trusted SWF に無制限で与えられる権限を示しています。local-trusted SWF は、ローカルファイルを読み取ったり、あらゆるサーバーとやり取りを行ったり、他のすべての SWF をスクリプティングしたりすることができます。
図 8 local-trusted SWF に与えられる権限
図 9 は、local-with-filesystem SWF にデフォルトでは適用されないが、アクセス許可を使用して与えられる権限を示しています。local-trusted SWF は、System.security.allowDomain("*") を使用して、local-with-filesystem SWF によるスクリプティングを許可することができます。
図 9 アクセス許可によって local-with-filesystem SWF に与えられる権限
すべてのドメインにアクセスを許可することによってのみ、local-with-filesystem SWF にアクセスを許可することができます。Flash Player ではローカル SWF のソースを判断することができないため、local-with-filesystem SWF にアクセスを許可すると、すべての SWF に許可を与えることになります。すべてのドメインにアクセスを許可する必要があるのはこのためです。
リモート SWF や local-with-networking SWF が local-with-filesystem SWF にアクセス許可を与えることはできません。これば、この許可が可能な場合、local-with-filesystem SWF とリモート SWF または local-with-networking SWF が連携して、ローカルファイルシステムのデータを読み取り、そのデータを Web サーバーに送ることができてしまうためです。
アクセス許可が与えられない場合、local-with-filesystem SWF ができるのは、ローカルファイルシステムのデータを、XML.load() などを使用してロードすることだけです。
図 10 は、local-with-filesystem ではなく local-with-networking であると宣言したローカル SWF にデフォルトで与えられる権限を示しています。アクセス許可が与えられない場合、local-with-networking SWF ができるのは、他の local-with-networking SWF と通信し、XML.send() などを使用してデータをサーバーに送ることだけです。
図 10 デフォルトで local-with-networking SWF に与えられる権限
図 11 は、local-with-networking SWF にデフォルトでは適用されないが、アクセス許可を使用して与えられる権限を示しています。
図 11 アクセス許可によって local-with-networking SWF に与えられる権限
local-with-networking SWF は、a.com のポリシーファイルがすべてのドメインからのアクセスを許可している場合に、XML.load() などを使用して a.com サーバーのデータを読み取ることができます。
local-with-networking SWF は、a.com の SWF が System.security.allowDomain("*") を呼び出した場合に、a.com SWF の ActionScript メソッドなどを呼び出して a.com の SWF をクロススクリプティングすることができます。同様に、local-with-networking SWF は、local-trusted SWF が allowDomain("*") を呼び出した場合、local-trusted SWF をクロススクリプティングすることができます。
すべてのドメインにアクセスを許可することによってのみ、local-with-networking SWF にアクセスを許可することができます。Flash Player ではローカル SWF のソースを判断することができないため、local-with-networking SWF にアクセスを許可すると、すべての SWF に許可を与えることになります。すべてのドメインにアクセスを許可する必要があるのはこのためです。
local-with-networking SWF がローカルファイルからデータを読み取ることを許可されることはありません。
図 12 は、最大限のアクセス許可のセットが与えられた場合に考えられるデータフローをまとめたものです。
図 12 データフローの概要
アクセス許可を使用すると、local-with-networking SWF がリモート SWF やサーバーと完全に相互操作できるようにすることができます。また、アクセス許可を使用して、local-trusted SWF とネットワークリソースが自由に通信できるようにすることもできます。
ただし、最大限のアクセス許可のセットを使用しても、ローカルファイルシステムのデータをインターネットに送るには、local-trusted SWF を経由することが必要です。