クロススクリプト

Flash Player 9 以降、Adobe AIR 1.0 以降

ActionScript 3.0 で記述された 2 つの SWF ファイル、または AIR で実行される 2 つの HTML ファイルが同じドメインに所属している場合は、例えば 1 つの SWF ファイルの URL が http://www.example.com/swfA.swf、もう 1 つの SWF ファイルの URL が http://www.example.com/swfB.swf であれば、片方のファイルに定義されたコードはもう一方の変数、オブジェクト、プロパティ、メソッドなどを検査および変更でき、その逆も可能です。これをクロススクリプトと呼びます。

2 つのファイルが異なるドメインに所属している場合(例えば http://siteA.com/swfA.swf および http://siteB.com/swfB.swf)、Flash Player および AIR のデフォルトでは、swfA.swf で swfB.swf をスクリプトすることも、swfB.swf で swfA.swf をスクリプトすることもできません。SWF ファイルは、 Security.allowDomain() を呼び出すことで他のドメインの SWF ファイルに許可を付与します。 Security.allowDomain("siteA.com") を呼び出すことで、swfB.swf での siteA.com の SWF ファイルのスクリプト許可が付与されます。

AVM1 SWF ファイルと AVM2 SWF ファイル間でのクロススクリプトはサポートされません。 AVM1 SWF ファイルは、ActionScript 1.0 または ActionScript 2.0 を使用して作成されたファイルです。 AVM1 および AVM2 は、ActionScript 仮想マシンを意味します。 しかし、LocalConnection クラスを使用すると、AVM1 と AVM2 間でデータを送信できます。

クロスドメインの場合は、関与する 2 つのドメインを明確にすることが重要です。 説明のため、ここでは、クロススクリプトを実行する側をアクセス元(通常、アクセスする SWF)と呼び、もう一方をアクセス先(通常、アクセスされる SWF)と呼びます。次の図に示すように、siteA.swf が siteB.swf をスクリプトする場合、siteA.swf がアクセス元で、siteB.swf がアクセス先です。

Security.allowDomain() メソッドを使用して確立されるクロスドメイン許可は非対称です。前の例では、siteA.swf は siteB.swf をスクリプトできますが、siteB.swf は siteA.swf をスクリプトできません。この理由は、siteB.com の SWF ファイルに siteA.swf をスクリプトする許可を付与するための Security.allowDomain() メソッドを siteA.swf で呼び出していないからです。対称的な許可を設定するには、両方の SWF ファイルで Security.allowDomain() メソッドを呼び出します。

Flash Player では、SWF ファイルを他の SWF ファイルによるクロスドメインスクリプトから保護するだけでなく、HTML ファイル によるクロスドメインスクリプトからも保護します。 HTML から SWF へのスクリプトは、 ExternalInterface.addCallback() メソッドを通じて確立されたコールバックで発生させることができます。HTML から SWF へのスクリプトがドメインを越える場合、アクセス先 SWF ファイルは、アクセス元が SWF ファイルの場合と同様に、 Security.allowDomain() メソッドを呼び出す必要があります。さもなければ、操作は失敗します。詳しくは、 作成者(開発者)コントロール を参照してください。

また、Flash Player は SWF から HTML へのスクリプトのセキュリティ管理も行います。 詳しくは、 送信 URL アクセスの制御 を参照してください。

ステージのセキュリティ

Stage オブジェクトの一部のプロパティとメソッドは、表示リストのスプライトやムービークリップで使用できます。

しかし、Stage オブジェクトには所有者があるといいます。つまり、ロードされた最初の SWF ファイルです。 デフォルトでは、Stage オブジェクトの次のプロパティおよびメソッドは、ステージ所有者と同じセキュリティサンドボックス内の SWF ファイルでのみ使用できます。

プロパティ

メソッド

align

addChild()

displayState

addChildAt()

frameRate

addEventListener()

height

dispatchEvent()

mouseChildren

hasEventListener()

numChildren

setChildIndex()

quality

willTrigger()

scaleMode

showDefaultContextMenu

stageFocusRect

stageHeight

stageWidth

tabChildren

textSnapshot

width

ステージ所有者のサンドボックスを除き、サンドボックス内の SWF ファイルが上記のプロパティおよびメソッドにアクセスするには、ステージ所有者の SWF ファイルは、 Security.allowDomain() メソッドを呼び出して、外部サンドボックスのドメインを許可する必要があります。詳しくは、 作成者(開発者)コントロール を参照してください。

frameRate プロパティは特殊なケースです。SWF ファイルはすべて frameRate プロパティを読み取ることができます。しかし、このプロパティを変更できるのは、ステージ所有者のセキュリティサンドボックス内にあるか、 Security.allowDomain() メソッドの呼び出しによって許可を付与された SWF ファイルだけです。

Stage オブジェクトの removeChildAt() および swapChildrenAt() メソッドにも制限がありますが、それらは他の制限と異なっています。これらのメソッドを呼び出すには、コードは、ステージ所有者と同じドメイン内にある必要はなく、影響を受ける子オブジェクトの所有者と同じドメイン内にある必要があります。あるいは、子オブジェクトは Security.allowDomain() メソッドを呼び出すことができます。

表示リスト内の移動

SWF ファイルから他のサンドボックスからロードされた表示オブジェクトにアクセスする機能は制限されます。 SWF ファイルが別のサンドボックス内にある別の SWF ファイルによって作成された表示オブジェクトにアクセスするには、アクセス先の SWF ファイルが Security.allowDomain() メソッドを呼び出し、アクセス元の SWF ファイルのドメインによるアクセスを許可する必要があります。詳しくは、 作成者(開発者)コントロール を参照してください。

Loader オブジェクトでロードされた Bitmap オブジェクトにアクセスするには、URL ポリシーファイルはイメージファイルの元のサーバー上に存在する必要があり、その URL ポリシーファイルは、SWF ファイルのドメインに、Bitmap オブジェクトにアクセスする許可を付与する必要があります( Web サイトのコントロール(ポリシーファイル) を参照)。

ロードされたファイル(および Loader オブジェクト)に対応する LoaderInfo オブジェクトは、3 つのプロパティ( childAllowsParent parentAllowsChild および sameDomain )を含んでおり、これらのプロパティはロードされたオブジェクトと Loader オブジェクトの間の関係を定義します。

イベントセキュリティ

表示オブジェクトに関連するイベントには、イベントを送出する表示オブジェクトのサンドボックスに基づくセキュリティアクセスの制限があります。 表示リストのイベントは、バブリング段階とキャプチャ段階に分けられます( イベント処理 を参照)。バブリングおよびキャプチャ段階では、イベントは表示リスト内のソース表示オブジェクトから親表示オブジェクトに移行します。 親オブジェクトがソースの表示オブジェクトと異なるセキュリティサンドボックス内にある場合、キャプチャおよびバブリング段階はその親オブジェクトの下で停止します。ただし、親オブジェクトの所有者とソースオブジェクトの所有者の間に相互の信頼関係がある場合は除きます。 この相互の信頼関係は、次のようにして達成できます。

  1. 親オブジェクトを所有する SWF ファイルは、ソースオブジェクトを所有する SWF ファイルのドメインを信頼するために、 Security.allowDomain() メソッドを呼び出す必要があります。

  2. ソースオブジェクトを所有する SWF ファイルは、親オブジェクトを所有する SWF ファイルのドメインを信頼するために、 Security.allowDomain() メソッドを呼び出す必要があります。

ロードされたファイル(および Loader オブジェクト)に対応する LoaderInfo オブジェクトは、2 つのプロパティ( childAllowsParent および parentAllowsChild )を含んでおり、これらのプロパティはロードされたオブジェクトと Loader オブジェクトの間の関係を定義します。

表示オブジェクト以外のオブジェクトから送出されたイベントの場合、セキュリティチェックやセキュリティ関連の影響はありません。