ExternalInterfaceを使ったFlashの呼び出し元制御

2007.02.12 / actionscript javascript

ActionScriptでExternalInterfaceを利用するとActionScriptからJavaScriptを呼び出せることができるのですが、普通に使うとJavaScript側で関数定義を行っておく必要があります。

たとえばActionScript側で

var ua = ExternalInterface.call(“getUserAgent”);

のように呼び出し、JavaScript側で

function getUserAgent(){ return navigator.userAgent; }

のような定義を行っておく必要があります。

あるに決まってます。。と今日の今日まで思ってたのですが、よく考えたらcallの引数って無名関数でもOKな、はずなんですよね。実はこれって結構便利。

たとえば先に書いたコードはこんな感じで書き換えられます。

var ua = ExternalInterface.call(“function() { return navigator.userAgent }”);

こうすりゃわざわざJavaScript側で関数を定義する必要もなく、手軽にJavaScriptを呼び出せます。

あと、ブラウザの機能を使うときにActionScriptだけでは難しいことも、JavaScriptを使えば楽にできることは多々あるのですが、無名関数で呼び出すことでコードの隠蔽も可能になります。

つまり、swfにJavaScriptを埋め込むことでユーザ側にコードを見られることも(ほぼ、ある程度、)防ぐことができ、swfの呼び出し元制御による不正利用も防ぐことが可能になります。

たとえば

var clientHost : String = ExternalInterface.call (“function() { return window.location.hostname }”).toString (); if(clientHost.indexOf(“hoge.com”)==-1){ trace(“呼び出し元が不正です!”); }

なんてことも可能となります。

JavaScript側でhostname取得関数を定義しておくと、ユーザ側で上書き定義されたJavaScriptを用意+勝手に作ったHTMLで不正利用なんかも簡単にできちゃいますが、無名関数を使ってswfに埋め込むことで、それについてもある程度回避は可能になるわけですね。