ローカル環境でFlashからJavaScriptが実行できない場合の対策方法
presented by 役に立つかもしれないBlog
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" height="100" 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" height="100"></embed> </object>
ちなみに、このallowScriptAccessなる属性ですが、以下のようなバリエーションがあり、通常は「sameDomain」が設定されています。(Flash Player 7以前では「always」になります。)
allowScriptAccessバリエーション
- never:外部とやり取りしようとするスクリプトは常に遮断されます。
- always:スクリプトは常に外部とやり取りできます。
- sameDomain:ホストしているWebページと同じドメインにそのSWFファイルが存在する場合に限って、スクリプトと外部のやり取りが許可されます。(Flash Player 8からSWFでこの設定がサポートされるようになっています)
まとめ
なぜこのような制限がかけられているかというと、ローカルにあるswfがネットワーク上のswfにデータを送信できないようにするためです。
これが可能になっていると、PC内にどこからか入手した不明なswfを実行した場合に不正にPC内の情報を読み込み、攻撃者のswfにそのデータが送信されて悪用される恐れがあるためです。
このページに関連のある記事はこちら
- SeleniumでjQueryを利用する
- JavaScriptでDATETIME型の日付を得る方法
- JavaScriptで全角数字を半角数字に変換する方法(おまけつき)
- tableにjQueryのtoggleを使うと幅が100%に広がらない件
- JavaScript+Prototype.jsで右クリックメニューが作れる「Proto.Menu」
- jQueryでbit.lyと連携。短縮URLをTwitterに投稿してもらう方法
- JavaScriptで日付から「第○曜日」(何番目の曜日か)を調べる方法
- FLV動画をシンプルにループ再生させる方法(ActionScript3.0)
- レビュー:基本からしっかりわかるActionScript 3.0
- Flashのマスクでグラデーションを利用する方法
- PhoneGapとAppleデベロッパーライセンスの同意事項について



コメントフォーム