ローカル環境でFlashからJavaScriptが実行できない場合の対策方法
Flashプラットフォームでは、Flash Player 8 からローカルセキュリティポリシーが変更になり、通常の記述ではswfファイルのActionScriptからJavaScriptの命令を記述しても動かないようにガードされるようになりました。 今回はその問題を解決する方法です。
「こんな環境だと動かない!」という例
1.ローカル環境で実行していること
この問題はWEBサーバー上にアップロードしている場合は起こりません。 制作者がサーバーにアップロードする前にローカル環境でWEBページに埋め込まれたswfをテストしている場合に起こります。
2.swf内で外部スクリプトを実行していること
たとえば、getURL()などを利用して以下のようにhtmlページ内のJavaScriptを呼び出している場合
getURL("javascript:hoge();");
このような状態でhtml側のJavaScriptコードを実行しても、動作しません。 以下はサンプルで別ウィンドウを開く命令です。
<script type="text/javascript"> function hoge() { window.open("sample2.html", "top", "toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=0,resizable=0,width=300,height=350"); } </script>
解決法
この問題を解決するには、swfファイルを埋め込んだhtmlページで<object>タグと<embed>タグに「allowScriptAccess=”always”」を付加します。
例
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="200" title="sample"> <param name="movie" value="sample.swf"> <param name="quality" value="high"> <param name="allowScriptAccess" value="always"> <embed src="sample.swf" allowScriptAccess="always" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="200"></embed> </object>
ちなみに、このallowScriptAccessなる属性ですが、以下のようなバリエーションがあり、通常は「sameDomain」が設定されています。(Flash Player 7以前では「always」になります。)
allowScriptAccessバリエーション
- never:外部とやり取りしようとするスクリプトは常に遮断されます。
- always:スクリプトは常に外部とやり取りできます。
- sameDomain:ホストしているWebページと同じドメインにそのSWFファイルが存在する場合に限って、スクリプトと外部のやり取りが許可されます。(Flash Player 8からSWFでこの設定がサポートされるようになっています)
まとめ
なぜこのような制限がかけられているかというと、ローカルにあるswfがネットワーク上のswfにデータを送信できないようにするためです。
これが可能になっていると、PC内にどこからか入手した不明なswfを実行した場合に不正にPC内の情報を読み込み、攻撃者のswfにそのデータが送信されて悪用される恐れがあるためです。
2010-01-30