サンドボックスタイプを取得する
■サンドボックスタイプを確認する
現在のサンドボックスタイプを取得するには、Security.sandboxType プロパティを使用します。
■サンドボックスタイプの種類
定数 | 文字列 | 効果 |
Security. |
"remote" | ネットワーク上で動作しています。 |
Security. |
"localWithFile" | ローカル上で動作しています。 「ローカルファイルにのみアクセスする」が選択されています。 |
Security. |
"localWithNetwork" | ローカル上で動作しています。 「ネットワークにのみアクセスする」が選択されています。 |
Security. |
"localTrusted" | 信頼できるファイルとして「Flash Player 設定マネージャ」か、"FlashPlayerTrust" 構成ファイルにより登録されています。 |
Security. |
"application" | AIR アプリケーションとして動作しています。 |
■取得例
サンドボックスタイプを取得する
import flash.text.TextField;
import flash.system.Security;
// ------------------------------------------------------------
// テキストフィールド
// ------------------------------------------------------------
// テキストフィールドを作成
var text_field:TextField = new TextField();
text_field.x = 10;
text_field.y = 10;
text_field.width = stage.stageWidth - 20;
text_field.height = stage.stageHeight - 20;
text_field.border = true;
stage.addChild(text_field);
// ------------------------------------------------------------
// サンドボックスタイプを調べる
// ------------------------------------------------------------
text_field.text = "SandboxType : " + Security.sandboxType;
クロスドメインポリシーについて
■クロスドメインポリシーについて
自身の Flash から、別ドメインにある一部のリソースを、読み取りアクセスする事はできません。
■テキスト系ファイルのアクセス制限
例えば、HTML や XML 文書を、読み取りアクセスする事はできません。
例えば、CGI のページにアクセスする事はできません。
■メディア系ファイルのアクセス制限
画像、音楽、動画などのメディアファイルは、読み込んで表示する事ができます。
しかし、情報をキャプチャする事はできません。
例えば、画像ファイルを、キャプチャーする事はできません。
例えば、動画ファイルの映像を、キャプチャーする事はできません。
例えば、サウンドファイルから、ID3 タグを取得する事はできません。
■ソケット通信のアクセス制限
ソケット通信の接続は失敗します。
■クロスドメインポリシーを解除する
クロスドメインポリシーは解除する事ができます。
ポリシーファイルと呼ばれる XML ファイルを、サーバーに設置します。
■クロスドメインポリシーファイルについて
■クロスドメインポリシーファイルについて
ポリシーファイルは、リソースが格納されている、サーバー側に設置します。
ポリシーファイルを設置すると、任意の別ドメイン内の Flash から、自身のサーバー内のリソースを読み取れるようになります。
リソースシェアリングの一種です。
ポリシーファイルの設定は、子孫ディレクトリにも反映されます。
■シンプルな記述例
「sub.example.com」内の Flash から、読み取りアクセスされる事を許す
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="sub.example.com" />
</cross-domain-policy>
■ <allow-access-from> 要素について
読み取りアクセスされる事を許可する、相手の情報を指定します。
以下の属性があります。
■相手のドメイン名を指定する( domain 属性)
ワイルドカード 『 * 』 の指定が可能です。
複数のドメインを指定するには、<allow-access-from> 要素を複数記述します。
「example.com」内の Flash から、読み取りアクセスされる事を許す
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="example.com" />
</cross-domain-policy>
「*.example.com」内の Flash から、読み取りアクセスされる事を許す
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*.example.com" />
</cross-domain-policy>
複数のドメイン内の Flash から、読み取りアクセスされる事を許す
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="example.com" />
<allow-access-from domain="example.net" />
<allow-access-from domain="127.0.0.1" />
</cross-domain-policy>
■すべての Flash を許可する
『 * 』とだけ記述した場合、すべての Flash からのアクセスを許可します。
セキュリティリスクに注意して下さい。
ネットワーク実行からの、読み取りアクセスだけではありません。
ローカル実行からの、読み取りアクセスも許可します。
すべての Flash から、読み取りアクセスされる事を許す(セキュリティリスクに注意)
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>
■相手のポート番号を指定する( to-ports 属性)
to-ports 属性を省略した場合、すべてのポート番号を許可します。
『 * 』とだけ記述した場合と同等です。
複数の番号を指定するには、カンマ 『 , 』で区切ります。
範囲指定するには、『 番号-番号 』と記述します。
すべてのポート番号から、アクセスされる事を許す
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="example.com" to-ports="*" />
</cross-domain-policy>
80番ポートのみ、アクセスされる事を許す
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="example.com" to-ports="80" />
</cross-domain-policy>
1024番と1026番と1028番ポートのみ、アクセスされる事を許す
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="example.com" to-ports="1024,1026,1028" />
</cross-domain-policy>
1024~2048番ポートのみ、アクセスされる事を許す
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="example.com" to-ports="1024-2048" />
</cross-domain-policy>
■許可する相手のセキュア状態を指定する( secure 属性)
省略した場合、セキュアな通信の汚染を許しません。
例えば、自身のリソースがセキュア(https) で、相手の Flash がアンセキュア(http) である場合、拒絶します。
この制限を解除するには、false を指定します。
セキュリティリスクに注意して下さい。
セキュアな通信が汚染する相手から、アクセスされる事を許す(セキュリティリスクに注意)
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="example.com" secure="false" />
</cross-domain-policy>
■マスターポリシーファイルについて
■マスターポリシーファイルとは?
ルートフォルダ内(ドメイン直下)に「crossdomain.xml」という名前で設置した、ポリシーファイルです。
例えば、「http://example.com/crossdomain.xml」です。
マスターポリシーファイルを、別の名前に変更する事はできません。
デフォルトでは、マスターポリシーファイルのみが有効です。
それ以外のポリシーファイルは、無効です。
■ <site-control> 要素について
<site-control> 要素は、マスターポリシーファイルにのみ記述できます。
permitted-cross-domain-policies 属性から、メタポリシーを設定します。
■メタポリシーの設定について
メタポリシーは、サーバー管理者用の設定です。
自身のサーバー内の、ポリシーファイルの取り扱い方法を指定します。
値 | 効果 |
"none" | すべてのポリシーファイルが無効です。 |
"master-only" | マスターポリシーファイルのみが有効です。 それ以外のポリシーファイルは無効です。 この設定はデフォルトです。 |
"all" | すべてのポリシーファイルが有効です。 サブフォルダごとに、ポリシーファイルを設置する事ができます。 |
値 | 効果 |
"by-ftp-filename" | 「crossdomain.xml」という名前のファイルのみが有効です。 FTP サーバで指定します。 |
"by-content-type" | 「Content-Type」が「text/x-cross-domain-policy」である場合のみ有効です。 HTTP サーバで指定します。 |
値 | 効果 |
"none-this-response" | このポリシーファイルは、サーバー管理者によって無力化されます。 サーバー管理者が、レスポンスヘッダを上書きして指定します。 |
■マスターポリシーファイルの記述例
サブフォルダごとにポリシーファイルを設置する事を許さない。(マスターポリシーファイルのみが有効)
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="master-only" />
<allow-access-from domain="a.example.com" />
<allow-access-from domain="b.example.com" />
<allow-access-from domain="c.example.com" />
</cross-domain-policy>
サブフォルダごとにポリシーファイルを設置する事を許す
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="all" />
</cross-domain-policy>
すべてのポリシーファイルを無効化する
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="none" />
</cross-domain-policy>
■マスターポリシーファイルが設置できない場合について
サブフォルダのポリシーファイルごとに、メタポリシーの設定を行う事もできます。
■ポリシーファイルごとにメタポリシーの設定を行う
■ X-Permitted-Cross-Domain-Policies ヘッダについて
.htaccess を使って、crossdomain.xml ファイルにヘッダを追加する
<Files "crossdomain.xml">
Header add X-Permitted-Cross-Domain-Policies "all"
</Files>
■メタポリシーの優先度について
X-Permitted-Cross-Domain-Policies ヘッダの方が、優先的に動作します。
マスターポリシーファイルの <site-control> 要素は、サーバー全体の、基礎的なメタポリシー設定として機能するでしょう。
マスターポリシーファイルを、絶対的に優先させる方法もあります。
■メタポリシーの "none-this-response" 設定について
X-Permitted-Cross-Domain-Policies ヘッダを、"none-this-response" 値で上書きします。
バックドアの恐れがあるポリシーファイルなど、まとめて無力化できます。
例えば、CGI スクリプトから、動的に出力されるポリシーファイルです。
■サーバーにポリシーファイルを設置する(全体設定)
自身は、「http://my.com」を管理しているとします。
「http://other.com/flash.swf」に「Flash ムービー」があるとします。
「Flash ムービー」から「http://my.com」内のリソースを読みたいとします。
1.マスターポリシーファイルを設置する(サーバー側)
サーバー全体にポリシーを適用するには、マスターポリシーファイルを設置します。
「http://my.com/crossdomain.xml」に格納します。
「http://other.com」からのアクセスを許す例です。
「other.com」内の Flash から、読み取りアクセスされる事を許す
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="other.com" />
</cross-domain-policy>
2.マスターポリシーファイルを読み込む(Flash 側)
大抵の場合、何もする必要はありません。
コンテンツの種類によっては、loadPolicyFile() メソッドの呼び出しが必要です。
「http://my.com/crossdomain.xml」のポリシーファイルを読み込みます。
my.com のマスターポリシーファイルを読み込む
import flash.system.Security;
// マスターポリシーファイルを読み込む
Security.loadPolicyFile( "http://my.com/crossdomain.xml" );
3.動作確認する
読み取りアクセスが可能になりました。
■サーバーにポリシーファイルを設置する(フォルダごとに設定)
自身は、「http://my.com/sub/」を管理しているとします。
「http://other.com/flash.swf」に「Flash ムービー」があるとします。
「Flash ムービー」から「http://my.com/sub/」内のリソースを読みたいとします。
1.ポリシーファイルを設置する(サーバー側)
フォルダごとにポリシーを適用するには、ポリシーファイルを設置します。
ポリシーファイルを、「http://my.com/sub/crossdomain.xml」に格納します。
「http://other.com」からのアクセスを許す例です。
「other.com」内の Flash から、読み取りアクセスされる事を許す
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="other.com" />
</cross-domain-policy>
2.メタポリシーを設定する(サーバー側)
サブフォルダに格納したポリシーファイルは、デフォルトでは無効です。
有効にするには、メタポリシーの設定が必要となります。
すべてのポリシーファイルを有効にする例です。
サブフォルダごとに、ポリシーファイルの設置が可能となります。
すべてのポリシーファイルを有効にする
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="all" />
</cross-domain-policy>
3.マスターポリシーファイルが設置できない場合(サーバー側)
マスターポリシーファイルは、環境によっては設置できないでしょう。
.htaccess を使って、crossdomain.xml ファイルにヘッダを追加する
<Files "crossdomain.xml">
Header add X-Permitted-Cross-Domain-Policies "all"
</Files>
4.ポリシーファイルを読み込む(Flash 側)
loadPolicyFile() メソッドを使用します。
「http://my.com/sub/crossdomain.xml」のポリシーファイルを読み込みます。
my.com のサブフォルダのポリシーファイルを読み込む
import flash.system.Security;
// サブフォルダのポリシーファイルを読み込む
Security.loadPolicyFile( "http://my.com/sub/crossdomain.xml" );
5.動作確認する
読み取りアクセスが可能になりました。
■ Flash からポリシーファイルを読み込む
Security.loadPolicyFile ( "URL" ) :Void
第01引数 | String | ポリシーファイルが設定されている URL アドレスを指定 |
戻り値 | Void | なし |
サブディレクトリのポリシーファイルを読み込む
import flash.system.Security;
// サブディレクトリのポリシーファイルを読み込む
Security.loadPolicyFile( "http://example.com/sub/crossdomain.xml" );
マスターポリシーファイルを読み込む(コンテンツの種類によっては不要)
import flash.system.Security;
// マスターポリシーファイルを読み込む
Security.loadPolicyFile( "http://example.com/crossdomain.xml" );
■ポリシーファイルの読み込み完了について
loadPolicyFile() メソッドは、非同期実行です。
読み込み完了を知る方法はありませんが、問題はありません。
読み込み系の処理は、内部でキューに登録され、順番に実行されます。
loadPolicyFile() メソッドの後、すぐに読み込み系の API を実行できます。
■テキスト系ファイルにアクセスする場合
もしサブフォルダにポリシーファイルが設置されている場合、事前に loadPolicyFile() メソッドを実行します。
■メディア系ファイルにアクセスする場合
ポリシーファイルが、自動的に読み込まれることはありません。
クロスドメインポリシーを解除したい場合、事前に loadPolicyFile() メソッドを実行します。
■サブディレクトリのポリシーファイルを読み込んだ場合
まず、X-Permitted-Cross-Domain-Policies ヘッダが、チェックされます。
もし、メタポリシーが解決しなかった場合、次にマスターポリシーファイルが読み込まれます。
メタポリシーが解決し、アクセスも許可されたなら、その時点で終了します。
場合によっては、マスターポリシーファイルへのアクセスは、省略されます。
クロスドメインスクリプトについて
■クロスドメインスクリプトについて
■クロスドメインスクリプトとは?
「自身の Web ページ」に、「別のドメインに存在する Flash 」を読み込むとします。
「自身の Web スクリプト」から「外部 Flash 」を制御する事はできません。
「外部 Flash のスクリプト」から「自身の環境」を制御させる事もできません。
このリスクあるアクセスを実際に行う事を、クロスドメインスクリプトといいます。
クロスドメインスクリプトを行うには、制限を解除します。(リスクに注意)
■外部ドメイン下のコンテンツから、自身の Flash 環境への侵入を許可する
「自身の Flash」は、「外部ドメイン下の Flash 」を読み込む事が可能です。
「自身の Flash」は、「外部ドメイン下のコンテンツ」に読み込まれる事が可能です。
この時、サンドボックスにより、自身の環境は保護されており、不可侵です。
外部ドメイン下のコンテンツから、自身の Flash 環境への侵入を許可するには、Security.allowDomain() メソッドを使用します。
Security.allowDomain ( "ドメイン名" , ... ) :void
可変引数 | String | 外部のドメイン名を指定。指定ドメインから制御される(侵入される)事を許可する。 すべてのドメインを許可する場合 "*" を指定。 複数のドメインを指定する場合、第02引数以降に順番に指定。 |
戻り値 | void | なし |
■自身がセキュア (https://) であり、アンセキュア (http://) な環境からの侵入を許す場合
高いセキュリティリスクがある事に注意してください。
中間者攻撃の恐れがあります。
セキュア (https://) 同士であれば、allowDomain() メソッドだけで実現できます。
Security.allowInsecureDomain ( "ドメイン名" , ... ) :void
可変引数 | String | 外部のドメイン名を指定。指定ドメインから制御される(侵入される)事を許可する。 すべてのドメインを許可する場合 "*" を指定。 複数のドメインを指定する場合、第02引数以降に順番に指定。 |
戻り値 | void | なし |
■ Flash と JavaScript を連携させている場合
Flash と JavaScript の連携については、こちらで解説しています。
「http://my.com/aaa.html」に格納された、「HTML 文書」があるとします。
「http://other.com/bbb.swf」に格納された、「Flash ムービー」があるとします。
「HTML 文書」内に「Flash ムービー」を読み込んで表示するとします。
ブラウザから、「http://my.com/aaa.html」を開いたとします。
■ http://my.com 側の処理について
allowScriptAccess パラメータに、"always" を設定します。
「http://other.com/bbb.swf」を表示し、bbb.swf から 自身の Web ページが制御される事を許す
<html>
<body>
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="550" height="400">
<param name="movie" value="http://other.com/bbb.swf" />
<param name="allowScriptAccess" value="always" />
<embed type="application/x-shockwave-flash" allowScriptAccess="always" src="http://other.com/bbb.swf" width="550" height="400" />
</object>
</body>
</html>
■ http://other.com 側の処理について
allowDomain() メソッドに、「my.com」を指定します。
「my.com」ドメイン下のコンテンツから、自身の Flash 環境への侵入を許す
import flash.system.Security;
// ------------------------------------------------------------
// 「my.com」ドメイン下のコンテンツから、自身の Flash 環境への侵入を許す
// ------------------------------------------------------------
Security.allowDomain( "my.com" );
■ Flash 内に、別の Flash を読み込んでいる場合
Flash を読み込む方法については、こちらで解説しています。
「http://my.com/aaa.swf」に格納された、「Flash (A)」があるとします。
「http://other.com/bbb.swf」に格納された、「Flash (B)」があるとします。
「Flash (A)」内に「Flash (B)」を読み込んで表示するとします。
ブラウザから、「http://my.com/aaa.swf」を開いたとします。
■ http://my.com 側の処理について
allowDomain() メソッドに、「other.com」を指定します。
「http://other.com/bbb.swf」を表示し、bbb.swf から自身の Flash 環境への侵入を許す
import flash.display.DisplayObjectContainer;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.system.Security;
// ------------------------------------------------------------
// Document オブジェクト(メインタイムライン)を取得する
// ------------------------------------------------------------
var document_obj:DisplayObjectContainer = stage.getChildAt(0) as DisplayObjectContainer;
// ------------------------------------------------------------
// 「other.com」ドメイン下のコンテンツから、自身の Flash 環境への侵入を許す
// ------------------------------------------------------------
Security.allowDomain( "other.com" );
// ------------------------------------------------------------
// Loader オブジェクトを作成して表示する
// ------------------------------------------------------------
var loader:Loader = new Loader();
// Document の表示リストに登録する
document_obj.addChild(loader);
// ------------------------------------------------------------
// 「http://other.com/bbb.swf」を読み込む
// ------------------------------------------------------------
// URLRequest オブジェクトを作成する
var url_request:URLRequest = new URLRequest("http://other.com/bbb.swf");
// リクエストを指定して、読み込みを開始する
loader.load(url_request);
■ http://other.com 側の処理について
allowDomain() メソッドに、「my.com」を指定します。
「my.com」ドメイン下のコンテンツから、自身の Flash 環境への侵入を許す
import flash.system.Security;
// ------------------------------------------------------------
// 「my.com」ドメイン下のコンテンツから、自身の Flash 環境への侵入を許す
// ------------------------------------------------------------
Security.allowDomain( "my.com" );
JavaScript 実行のセキュリティについて
■スクリプトアクセス許可設定について
自身の HTML(JavaScript)が、埋め込んだ Flash と、相互スクリプトアクセスできる事を許可するには、allowScriptAccess パラメータを使用します。
Flash と JavaScript の連携については、こちらで解説しています。
■設定例
<object> タグに、allowScriptAccess パラメータを追加する
<object type="application/x-shockwave-flash" data="test.swf" width="550" height="400">
<param name="movie" value="test.swf" />
<param name="allowScriptAccess" value="samedomain" />
プラグインは未対応です。
</object>
<embed> タグに、allowScriptAccess パラメータを追加する
<embed type="application/x-shockwave-flash" allowScriptAccess="samedomain" src="test.swf" width="550" height="400" />
■設定可能な値
デフォルト値は、"samedomain" です。
設定値 | 効果 |
"always" | スクリプトアクセスを常に許可(Flash と HTML が別ドメインに置かれていても動作する) |
"samedomain" | 同じドメイン内に Flash と HTML が置かれている場合のみスクリプトアクセスを許可 |
"never" | スクリプトアクセスは不可能 |
■セキュリティリスクについて
外部に存在する、不特定の Flash を、自身のサイトに表示すると危険です。
悪意のある Flash は、JavaScript を使って、自身のサイトを自由に改変できます。
また、サイト内の個人情報を収集し、外部に送信する事ができます。
不特定の Flash を表示するなら、"never" や "samedomain" が最適です。
■信頼する Flash が、別ドメインに存在する場合
allowScriptAccess パラメータに、"always" を指定します。
Flash 側にて、クロスドメインスクリプトの許可設定を行います。
クロスドメインスクリプトについては、こちらで解説しています。
■ローカル環境でのスクリプトアクセスについて
ローカル環境では、Flash と JavaScript の、相互スクリプトアクセスはできません。
制限は解除する事もできます。(リスクに注意)
「グローバルセキュリティ設定パネル」から、許可したい Flash を、信頼できるファイルとして登録します。
この設定は、開発者向けのものであり一般的ではありません。