2006/04/12

Web制作者のためのEolasパッチ対策

4月のセキュリティアップデートでIEの脆弱性対策の他にEolas特許対策パッチも来てるみたいですねー。まぁ、先延ばしパッチも一緒にきたとかなんとかで(確認してないけど)、それも当ててれば6月まではとりあえず関係ないらしいけど、逆にいえばそれまでになんとかしろよって事みたいですね。

どうやらそのパッチによってマウスとかのイベントがアクティブ化されないと送られないようなので、ホントにそうなのか、適当にFlashつくって試してみました。

beatsync.netサイトマップFlash
手抜きでごめんなさい。

で、これをEolas対策パッチの入ったIEでみると、クリックしないとFlashがアクティブにならないわけです。

対策済みIEでの見え方
クリックするか、Spaceを押してアクティブ化しなさいよ、と。

で、今回の話はこのIEでインタラクティブなFlashを使うときにいちいちクリックしないとならないのは何とかなんないの! って話なんですが、MSDNの方で既にActiveX コントロールのアクティブ化というタイトルで詳細がでてます。それによると

非アクティブなコントロールが作成されると、Internet Explorer ではさまざまな方法を使用して、キーボードまたはマウスのウィンドウ メッセージがコントロールに到達しないようにします。

まぁよくわかんないですが、力づくでもクリックしないと使わせないぜ! みたいな意味にも取れるんじゃないかこれみたいなツッコミはおいておいて、下の方に「外部からの対話型コントロールの読み込み」というところにクリックせずともActiveXコンテンツを最初からアクティブ化させる方法が乗ってました。

スクリプトが、たとえば writeln 関数 を使用して、プログラムによってインラインで記述されている場合、読み込まれたコントロールは HTML ドキュメント自体によって読み込まれたように動作するため、アクティブ化する必要はありません。

つまり、よくわかんないんですが、特許のキモはWebサイトに埋め込まれたアプリケーション起動情報をつかってブラウザ(というかIE)がActiveXを起動するっていうのがポイントなので、HTMLに埋め込まれたスクリプトによってアプリケーション起動情報が動的に生成された場合は別にWebサイト自体に(最初から)アプリケーション起動情報が埋め込まれてたわけじゃないからそれは特許に引っかからずActiveXを最初からアクティブ化させて起動させてオッケーですよーみたいな解釈らしいです。すごい理論です。

まぁともあれ、その通りにやってみることにしましょう。上の方で読み込まれていたbeatsync.netサイトマップFlashは直接XHTMLにobject要素を書いて読み込んでいました。こんな感じで。

<object data="/images/main/sitemap.swf" width="480" height="360"
 type="application/x-shockwave-flash">
<param name="movie" value="/images/main/sitemap.swf" />
beatsync.netサイトマップFlash <!-- 代替テキスト -->
</object>

これを、object要素を直接使わずに、外部スクリプトによってobject要素を生成すればいいらしいです。すなわち

<script src="/images/main/sitemap_loader.js" type="text/javascript"></script>
<noscript>beatsync.netサイトマップFlash</noscript>

みたいなのを書いておいて、sitemap_loader.jsでFlashを読み込むようなコードを書けばいいって事ですね。

ってことでやってみたんですが、MSIEではdocument.writelnで生のHTMLを埋め込めばOKなんだけど、OperaやFirefoxにはこのサイトはapplication/xhtml+xmlを食わせているのでdocument.writelnは使えません。ってことで、MSIE以外にはDOMを使ってobject要素を埋め込んでいます。まぁ詳細はjsのソース読んでください。

あと、DOM使うんだったらMSIEでもDOM使ってobject埋め込めばいいじゃん、とかおもったんですが、それはいろいろと面倒そうなので(前述MSDNドキュメントにcreateElementを使うときは先にうめこめよーみたいなことが書いてあります)、そのままwritelnでやっつけました。MSIEでDOMしたいときはcreateElement("<param name='movie' value='/images/main/sitemap.swf' />");みたいな生のHTMLを埋め込む拡張記法で要素を作る必要があるとかそんな話です。当然、これはFirefox/Operaでは通じない記法なので、DOMをつかってもuserAgentで場合分けは必要になるんだったらwritelnでいいやーと。

そういう感じで埋め込んでみたのが下のFlash。


まぁ、FirefoxとかOperaとかだと上のとなんら変わりませんが、パッチ済みIEではアクティブ化不要です。

はい、たしかにEolas対策パッチ適用済みのIEでも明示的にアクティブ化する必要もなくFlashが読み込まれました。あーすごいすごいー。まぁすごいかどうかは別として、こうやって対策すればIEでの閲覧者に対してもいままでどおりのユーザエクスペリエンスを提供することができますよー、みたいな感じらしいです。その猶予期間が、6月までってことみたいですね。

うされもん @acidlemonについて

|'-')/ acidlemonです。鎌倉市在住で、鎌倉で働く普通のITエンジニアです。

30年弱住んだ北海道を離れ、鎌倉でまったりぽわぽわしています。

外部サイト情報

  • twitter
  • github
  • facebook
  • instagram
  • work on kayac