アクセシビリティ

Flash記事

 

Flash Player 8 のセキュリティ機能の変更点


目次

連携するメディア用のローカルセキュリティ

これまでは、それ自体で動作する単一の SWF のローカルセキュリティについて説明してきました。ユーザーが許可しない限り、local-read と net-send の両方の権限を持つ個別の SWF はありません。しかし、複数の SWF が互いに連携するときには、Flash Player 8 で導入されたローカルセキュリティの拡張で Flash Player ユーザーを保護する必要もあります。連携する複数の SWF が、まとめて "1 セット" として local-read 権限と net-send 権限の両方を持つことはできません。

SWF 間の連携には 2 つの段階が必要です。まず、1 つの SWF が、通常は ActionScript loadMovie コマンドを使用して、もう 1 つの SWF をロードする必要があります。次に、ActionScript 変数、メソッド呼び出し、LocalConnection オブジェクトなどを使用して、2 つの SWF が互いに情報を交換します。この情報の交換は、"クロススクリプティング" と呼ばれることもあります。

Flash Player では、ローカルキュリティを維持するために SWF のロードが禁止される場合があります。また、SWF のロードは許可されるが、クロススクリプティングが制限される場合もあります。

同じサンドボックス内に置かれた SWF 間では、SWF のロードとクロススクリプティングが常に許可されます。たとえば、すべての local-with-filesystem SWF は他の local-with-filesystem SWF をロードおよびクロススクリプティングすることができ、すべての local-with-networking SWF は他の local-with-networking SWF をロードおよびクロススクリプティングすることができます。異なるサンドボックスに置かれた 2 つの SWF が連携を試みた場合には、前述の制限が適用されます。

表 1 は、サンドボックス間のロードおよびクロススクリプティングの制限をまとめたものです。個々の規則については後で説明します。SWF 間の連携には、必ず 2 つの SWF が関わっています。ここでは、連携操作を起こす (loadMovie を呼び出す、またはクロススクリプティングを実行する) SWF を "アクセスする SWF"、もう一方の SWF を "アクセスされる SWF" とします。表の上部のラベルはアクセスする SWF のサンドボックスを表し、表の左側のラベルはアクセスされる SWF のサンドボックスを表します。

表 1 サンドボックス間におけるロードおよびクロススクリプティングの制限
  アクセスする SWF のサンドボックス
アクセスされる SWF のサンドボックス local-
with-
filesystem
local-
with-
networking
local-
trusted
リモート
local-
with-
filesystem
ロード :
クロススクリプティング :
ロード : 不可 ロード :
クロススクリプティング :
ロード : 不可
local-
with-
networking
ロード : 不可 ロード :
クロススクリプティング :
ロード :
クロススクリプティング :
ロード : 不可
local-
trusted
ロード :
クロススクリプティング :
許可が必要
ロード :
クロススクリプティング :
許可が必要
ロード :
クロススクリプティング :
ロード : 不可
リモート ロード : 不可 ロード :
クロススクリプティング :
許可が必要
ロード :
クロススクリプティング :
ロード :
クロススクリプティング :
許可が必要
(ドメインが一致しない場合)

ロードの制限

表 1 の赤色のセルは、一部の SWF が loadMovie、loadMovieNum などを使用して他の SWF をロードできないことを示しています。

  • リモート SWF (HTTP などの非ローカルプロトコル経由で使用される SWF) は、ローカル SWF をロードできません。
  • local-with-networking SWF は local-with-filesystem SWF をロードできず、その逆の場合もロードできません。
  • local-with-filesystem SWF はリモート SWF をロードできません。これは、リモート SWF をロードするにはリモート URL を使用して loadMovie を呼び出す必要があるが、この操作は local-with-filesystem SWF には許可されない net-send 操作であるという、既に説明した規則によるものです。

local-with-filesystem SWF は local-with-networking SWF に簡単に変更できるため、後者の 2 つの規則は必要に応じて回避することができます。

しかし、"リモート SWF はローカル SWF をロードできない" という最初の規則は絶対的な規則であり、Flash Player の他の大部分の規則とは異なり、回避できません。この規則は、権限の低いゾーンにあるコンテンツ (リモート SWF) がより権限の高いゾーンにあるコンテンツ (ローカル SWF) をアクティブ化するという、"ゾーンエスカレーション" と呼ばれる状況が発生しないようにするためのものです。ユーザーが Web ページにアクセスしたときにローカルインストールされているコンテンツを起動する、ハイブリッド "リモート-ローカル" アプリケーションを管理している場合があります。このような場合は、エントリポイントを変更し、ユーザーがまずローカル SWF (またはローカルプロジェクタ、ローカル実行可能アプリケーションなど) を表示してからオンラインコンテンツをアクティブ化するように設定するのが最善の方法です。

Flash Player では、SWF ではなくブラウザページをロードする getURL 呼び出しについても、同様の規則があります。

  • リモート SWF はローカル URL を使用して getURL を呼び出すことができません。
  • local-with-filesystem SWF はローカル URL を使用して getURL 呼び出しを行うことができますが、これを実行した場合、クエリーパラメータやアンカー (URL で "?" または "#" の後に来る部分) が取り除かれてしまいます。

クロススクリプティングの制限

表 1 の黄色のセルは、アクセスされる SWF がその操作を明示的に許可する場合に限って、1 つの SWF がもう一方の SWF をスクリプティングできることを示しています。次の状況がこれに該当します。

  • non-trusted (信頼されない) ローカル SWF が local-trusted SWF をスクリプティングする場合は、local-trusted SWF がその操作を許可する必要があります
  • local-with-networking SWF がリモート SWF をスクリプティングする場合は、リモート SWF がその操作を許可する必要があります
  • リモート SWF が異なるドメインにある他のリモート SWF をスクリプティングする場合は、アクセスされる SWF がその操作を許可する必要があります (リモート SWF 間の規則は Flash Player 7 から変更されていません)。

Flash Player のグローバル許可の原則 に基づき、最初の 2 つの場合には、アクセスされる SWF が他のすべてのサンドボックスにあるアクセスする SWF に許可を与える必要があります。この許可を与えるには、System.security.allowDomain("*") を呼び出します。また、LocalConnection オブジェクトに対する場合は、"localhost" を示すドメイン引数が渡されたときに値 true を返す LocalConnection.allowDomain ハンドラを指定します。

永続化された共有オブジェクト

Flash Player 6 以降では、SharedObject クラスを使用して、永続化された共有オブジェクトがサポートされます。永続化された共有オブジェクトには、ユーザーのコンピュータのデータが格納されます。通常は、SharedObject.getLocal で取得されたローカル共有オブジェクトになりますが、永続化されたリモート共有オブジェクトを作成することもできます。これを作成するには Flash Media Server (以前の Flash Communication Server) が必要であり、この製品でリモート共有オブジェクトについてドキュメント化されています。

各リモートサンドボックスには、永続化された共有オブジェクトの格納場所が関連付けられています。たとえば、domain1.com の SWF が永続化された共有オブジェクトを読み込むか、永続化された共有オブジェクトに書き込む場合、Flash Player ではそのオブジェクトに対して domain1.com オブジェクトの格納場所で読み取りまたは書き込みを行います。同様に、domain2.com の SWF 場合は、domain2.com の格納場所が使用されます。名前の競合を避けるため、永続化された共有オブジェクトを識別するときにはパスも使用されます。このパスは、デフォルトでは作成元 SWF の URL のフルパスになりますが、localPath パラメータを使用して SharedObject.getLocal に短縮することもできます。このように短縮すると、同じドメインにある他の SWF が、作成された共有オブジェクトにアクセスできるようになります。

Flash Player 7 以前では、すべてのローカル SWF が 1 つの永続化された共有オブジェクトストア (共有オブジェクトの格納場所) を共有していました。Flash Player 8 以降には、ローカル共有オブジェクトストアが 2 つあります。Flash Player では、個別の共有オブジェクトストアを 2 つのローカルサンドボックスのそれぞれに割り当てることによって、local-with-filesystem SWF が local-with-networking SWF と通信できないようにしています。

Flash Player は、local-trusted SWF を local-with-filesystem SWF と同じ共有オブジェクトストアに割り当てます。これにより、local-with-filesystem ステータス (デフォルト) と local-trusted ステータスとの間の移行が簡単に行えるようになります。この移行操作は、意図したとおりに動作しなくなった既存のローカルコンテンツを修復する手段として、エンドユーザーが行うことができます。SWF のステータスがこのように移行されたときには、SWF によって作成されたすべての共有オブジェクトが保持されます。