ローカル環境で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