OperaはJavaScriptにおいて、MSIEのふりをします。「IEかNetscapeかで振り分ける」ページに対応するために、IE互換を選択したのでしょう。この挙動のため、JavaScriptで本物のIEであるかOperaであるかを鑑別したい場合には、工夫が必要になります。このメモでは、その方法について書きます。
「Windows/IEパッチのまとめ」を書いたとき、IEに特定のパッチ(Q316059)が適用されているかどうか確認する方法を説明しました。JavaScriptが有効であればその場で適用の有無を確認できます。JavaScriptを必要としない一般的な方法をまず説明したうえで、JavaScriptが有効であればさらに簡単に確認できるので、それらを並べて書いたわけです。
MSIE では、navigatorオブジェクトに appMinorVersion というIE独特の(拡張)プロパティがあり、ブラウザのバージョン情報の「更新バージョン」(Update Versions)欄に表示されるのと同じ内容が、文字列で入っています。ですから、基本的には、JavaScript(この場合、正確には JScript ですが)にて、
navigator.appMinorVersion
を参照すれば良いだけです。
しかし、Netscape や Mozilla には、このような(IE独自拡張の)プロパティは存在しません。定義されていないプロパティを参照しに行けば言うもなくエラーの原因になります。この場合は結果としてたいした問題じゃないかもしれませんが、まず navigator.appMinorVersion
がそもそも定義されているかどうかを確認するのが堅実なコーディングというものです。
新しいブラウザ(いわゆるJavaSciprt1.3以降)であれば、仕事は簡単です。
navigator.appMinorVersion == undefined ?
多少古いブラウザ(JavaSciprt1.1以降)でも問題が起こりにくくするには、
typeof navigator.appMinorVersion == "undefined" ?
と書くのも良いかもしれません。
問題は、いずれにしても、Opera6 がこのテストに true を返してしまうことなのです。IEのふりをするOperaには、もともとIE固有拡張であったnavigator.appMinorVersion
プロパティが実装されているのです(Opera5以降)。そのため、次のリストは、予期せぬ結果を招きます。
if( typeof( navigator.appMinorVersion ) == "undefined" ) document.write("お使いのブラウザはIEでありません。"); else { var updateVer = navigator.appMinorVersion; if( (updateVer.toLowerCase()).indexOf("q316059") >= 0 ) document.write("OK、パッチ適用済みです。"); else document.write("危険! パッチを適用してください。"); }
IEのパッチと無関係なOperaであるにもかかわらず、「危険! パッチを適用してください。」と出力されてしまいます。いかにもまぬけです。
いくつか例を挙げます。わりと深い洞察を使ったハックもあれば、その場しのぎの方法もありますが、とりあえず参考にしてください。Opera6のJavaScriptはかなり徹底してIE5あたりの挙動をエミュしてきますが、さがせばいろいろ「しっぽを出す」というものです。
navigator.appMinorVersion
が未定義。escape(String.fromCharCode(0x3042))=="%u3042" ?
typeof encodeURI=="function" ?
for(var i=0; i<navigator.plugins.length; i++){
if( (navigator.plugins[i].name.toLowerCase()).indexOf("opera")>-1 )
flag_opera = true;
}
ついでながら、JavaScriptが有効でないと閲覧に支障があるようなページは、できる限り作るべきでありません。<noscript>タグに「JavaSciptが必要です、有効にしてください」と書けば代替になる、という考えは間違いです。
2002-03-20 Opera 6.02 beta3 (1056) が出てたので入れてみた。ふと気づいたが、最近の Opera のJavaScriptにおけるIEへの化け方は、かなり徹底している。Opera5以降、
typeof( navigator.appMinorVersion )
が文字列 string を返して(値は空)、IE固有プロパティを持ってるふりまでしている。しかも、Opera6 になると escape("あ")
も %u3042 なのだ。
2002-03-21 Opera 6.02 beta4 (Build 1061)
2002-09-05 記事中の「累積的」パッチは、もはや最新でありません。現時点(2002年9月5日)では「Internet Explorer 用の累積的な修正プログラム (Q323759) (MS02-047)」があり、また、今後さらに更新される可能性があります。
どこを確認すればいいか画像入りで具体的にまとめてみました。まずは「累積的」パッチから/VBScriptエンジンの更新/Microsoft VMの更新/Media Playerの弱点をなおす――パッチに直接リンクしたので英語ページを読まなくてもDLできます。参考にしてください。
2002年5月17日現在の最新情報(3月22日、3月30日、4月2日、5月17日更新)(Media Playerに関する部分は7月26日に改訂)。情報はすぐ古くなるので注意してください。Internet Explorer 6.0(または5.5SP2)をインストールしてることを前提とします(XMLにきちんと対応しているIE6をおすすめします)。リンクされている修正ファイルは、すべて日本語版に対するものです。ブラウザや Media Player で英語版などほかの言語バージョンを使ってるかたは、べつの修正プログラムが必要になることが多いので気をつけてください。Windows 2000 のかたは、SP2 にくわえてSecurity Rollup Package 1 の適用もお忘れなく……。
「2002 年 5 月 15 日 Internet Explorer 用の累積的な修正プログラム (Q321232) (MS02-023)」 をダウンロードして実行すると、個別の修正パッチを適用しなくても、リンク先のページにリストアップされているいろんな問題をまとめて修正できる。
パッチ(修正用プログラム)の名前は同じ q321232.exe でも、IE6.0用 と IE5.5SP2用(SP2必須) で別ファイルなので注意(詳細)。
ダウンロードしたファイルをWクリックして起動すると「この修正プログラムをインストールしますか?」と尋ねられるので、「はい」と答えて数秒待ってれば修正完了という内容のメッセージが表示されます。ただそれだけの簡単な作業ですが、修正後にはOSの再起動が必要になるので注意。
この「累積的」パッチは、これまでの累積的パッチ(Q313675、Q316059、Q319182 など)の修正をすべて含んでいます。とりあえずこれひとつでOK、ということです。
IEの「ヘルプ→バージョン情報」を見る。「更新バージョン」欄に Q321232 が含まれていたらOK。
Q321232以外の文字はあってもなくてもOK
ドキュメント化されてるか分かりませんが、じつは「更新バージョン」欄の文字列は JScript の navigator.appMinorVersion
を使って外部からも見れます。そんなわけで、アクティブスクリプトが有効なブラウザでは、この下に情報が表示されます。この下の行は、あなた自身の環境に応じて自動的に変わります。
メモ: IE6SP1 beta を使っているかたは、単純には判定できません。個々の問題について、個別に評価、対応する必要があります。IE6SP1 beta がインストールされている場合、必要性があるにもかかわらずそのままではインストールできないパッチもあります。
IEではJavaScript互換のJScriptのほかに、VBScriptというスクリプトをブラウザ側で実行できるようになってます。VBScriptエンジンの古いバージョンにはセキュリティ上のバグがあります。詳細はMS02-009。
スクリプト・エンジンをビルド7302以降にする。IE6.0用(Windows 2000/XP)、IE6.0用(Windows 98/me)、IE5.5SP2用(Windows 2000)、IE5.5SP2用(Windows 95/98)。OSとIEのバージョンによって、ファイルが変わるので注意(詳細)
システムフォルダの Vbscript.dll のプロパティを見る(.DLLファイルが表示されない?)。VBScript バージョン 5.6(IE5.5では5.5)で、ビルドが7302以降になってればOK(5.6.0.7302、ないし 5.5.0.7302)。
アクティブスクリプトが有効なIEでは、この下にもバージョン情報が出ます。この下の行は、あなた自身の環境に応じて自動的に変わります。
Windows に入ってるJava仮想マシン(Java VM ないし JVM と略す) Microsoft VM (最近では、デフォルトでは入ってないらしいが)にも、ときどきセキュリティ上のバグが見つかってます。直近のMS02-013なんかは一般にはあまり関係なさそうですが、古いVMにはいろいろ問題があるようだし(例: MS00-059)、まぁ最新ビルドを入れとくに越したことは、ありません。2002年3月22日、追記。MS02-013が改訂されました。このパッチは、ほかのもっと重要なバグの修正にも役立つことが判明。
「Javaはオフにしておくのが基本」という意見もあるでしょうが(実際そうなのですが)、Javaという技術が悪いのでなく、それの実装に問題があるわけです。早い話、悪いのは Java でなく Microsoft VM なのだから、Microsoft VM をやめて別のJava仮装マシン――具体的には Sun Java ――を使うように設定するという手もあります。が、ある程度の知識が必要であるうえ、IE上では Microsoft VM のほうが軽快に動作するようです。ともかく、Microsoft VM のアップデートは簡単なので、ふだん無効にしてるとしても、これはこれでアップデートしときましょう。
現時点(2002年3月19日)での最新は、Microsoft VM (Build 3805)。自分のマシンのJavaのビルドを知るには――マウスクリックとGUIの世界でやるには――システムフォルダを開いて、
wjview.exe
を探します。
見つかったらクリックして、例えば、Java Version 5.00.3805 と出たら、5がメジャーバージョン、00がマイナーバージョン、3805がビルド。
wjview.exe がなければ、w のつかない jview.exe を探してアイコンを右クリック、プロパティ→バージョン情報を見る。DOS窓で良ければ jview とタイプすればパスが通ってます。
手元のビルドが3802やそれより前だと分かった場合は、Micorosoftのページ(日本語)に行って、最新版をダウンロードしアップデートするのも良いでしょう。Windows 2000用だけは別ファイルで、Security Update, March 4, 2002 から Japanese または Japanese NEC を選ぶことになります。2002年3月22日、追記。ほかの問題の解決にも役立つので、できればアップデートしたほうが良いです。
上で書いた方法でビルドが3805になったことを確認できたらOK。
「2002 年 6 月 26 日 Windows Media Player 用の
警告: 下記のパッチを適用すると、マシンの再起動が必要な場合があります。しかも、パッチ適用のために、選択の余地なしに再起動が始まる場合があります。これは、
C:\WINNT\System32\regsvr32.exe /s "C:\WINNT\System32\wmpcore.dll"
以下いくつかのコマンド、および、
C:\WINNT\inf\unregmp2.exe /Fixups
を自動実行するためです。
このパッチを適用した場合、wmp6と7の両方のバージョンが更新されます。wmp6 は 6.4.09.1124 または 6.4.07.1124 になります。 wmp7のバージョンの更新は、ソフトのバージョン情報メニューからは確認できません。Windows Media Player フォルダをひらいて、wmplayer.exe のアイコンを右クリック、プロパティのバージョン情報タブで「7.10.0.3068」となっていることを確認します。
最近XMLということばをよく聞かれると思います。HTMLなどよりもっと強力なデータ記述方法で、これからはXMLの時代になると考えられています。IE6.0には、このXMLを直接処理することができる「MSXML3」というモジュールが含まれていますが、このモジュールにセキュリティ上のバグが見つかっていました。IE5.5は、XMLを正しく処理できないかわり、このバグとは関係ありません。
詳細は「XMLHTTP コントロールにより、ローカル ファイルにアクセスすることができる (MS02-008)」。通常のIE6.0ユーザは、「Microsoft XML Core Services 3.0」用のQ318203_MSXML30_x86.exeを適用することになります。
当初から、MSXML3の修正には「英語版」「日本語版」のような言語の区別は関係ないのでは?という疑問がありましたが、結局のところ、この修正プログラムは英語版も日本語版もまったく同じでした。結果論ですが、わざわざ日本語版を待つ必要なかったわけです。
システムフォルダの msxml3.dll のファイルバージョンを調べます。IE6.0の付属品は「8.20.8730.1」だと思いますが、修正を行うと、もっと新しいバージョンのファイルで置き換えられます。この修正では、たぶん「8.20.9415.0」になるでしょう。
または、レジストリエディタで次のキーが存在するか確認します:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\DataAccess\Q318203
定期的にマイクロソフト セキュリティ情報一覧を見て、自分に関係ありそうなバグ修正がリリースされてないか確認してください。リストを見て、「なんてたくさんのバグがあるんだろう。Windowsは、ひどい欠陥商品だ」と思うかもしれませんが、その考え方は誤りです。Windowsは実際、あらゆる意味で理想的なOSとは言いかねますが、それとこれとは別問題。セキュリティというのは、スタティックなものではなく、プロセスです。これを使えば完全ですよ、と天下り的に与えられるものじゃなく、さまざまな状況に応じて動的に対応していく、そのフットワークがセキュリティというものだと思います。例えばウイルス対策ソフトをインストールして、これでもう安心、というのも間違った考え方です。ご承知のように定義ファイルをこまめに更新することが必要です。
Mac のことはよく知らないのですが、Linux に象徴されるオープンソースの世界でも、本当に毎日のように何かしら問題が見つかり、修正の必要が生じたりします。同列には論じられませんが、べつに Windows だけが特にバギーなソフトであるわけじゃありません。アール・ビバンであり、ワーク・イン・プログレスであり、生き物なのです。むしろ、Netscape 6 のように、途上品であるにもかかわらず、不具合を開示しない製品のほうが危険きわまります。一般のユーザが「不具合がニュースにならない Netscape は安全なブラウザなのだ」などと誤解してしまうからです。「IEはよく不具合がニュースになるから危険だから避けよう」などと錯覚してしまうからです。
「日航ジャンボ機が墜落したという話をどこかで聞いたことがあるぞ。日航機は、いろいろ事故を起こしているらしい。それにひきかえ、アエロフロート機に欠陥が見つかったというニュースは全然きいたことがない。よし日航を避けてアエロフロートを使おう。これで安全だ。」悪いたとえで恐縮ですが、そういう話です。Aに問題があるか?と、A以外なら問題がないか?は別。
IEに問題が見つかるのは事実ですが、IEを避ければ安全だというのは根拠のないことです。どこに問題があるか?の情報が多いIEのほうが――きちんと設定をするなら――ネスケよりは安心して使えます。オープンなモジラなら、もっと安心かもしれませんね。問題の本質は「バグが見つかる数」や「深刻度」じゃなく、それを開示してすぐにフィックスするか?でしょう。
いまだに Netscape 4.75 あたりを使ってブックマークが壊れてしまって、とほうにくれつつ、こんな世界の果てのサイト(妖精現実)にたどりつくかたが毎日のようにいるみたいです。Netscape の開発元では文字化け修復ツールを提供してないどころか、そもそも問題があったことすら認めてないのでしょうか……。マイクロソフトのMS02-014のように、修正プログラムをインストールしたらかえって文字化けが生じた、というのも別の意味でひどい話ですが、「本問題の対策の行われた修正プログラムがご用意できましたので、3 月14 日以前に修正モジュールの適用を行われたお客様は、改めて適用をお願い申し上げます。」と修正プログラムの修正版(笑)を出して、古い修正プログラムが壊してしまったところをちゃんと戻すようにしてます。どっちもどっちかもしれないし、マイクロソフトの情報も(前よりずっと見やすくなったとはいえ)なんだか漠然としていて分かりにくいですが、欠陥がありました、これこれこうしてください、と言ってくれるほうが、「またか」とあきれる気持ちもゼロでは無いけれど、欠陥があるのに黙っていられるよりは、ましでしょう。
言うまでもなく、マイクロソフトにも秘密主義の面も強いです。いわゆる「責任ある開示」の問題では、マイクロソフトの言い分にも一理あるとは思うけれど、「欠陥を公表すると危険だから公表しない」という考え方には、全面的には賛成できないかたも多いと思われます。
Windows関連の最近のセキュリティの話題に話を戻しますが、MSXML3 のセキュリティ問題が、まだ根本解決しておらず、暫定的に回避するしかありません(MS02-008参照: 2002年2月27日の記事に詳しく書いたように、MSXML4を入れても解決になりません)(2002年4月2日追加: この問題の修正パッチが出ました。)。IE5.5のユーザはデフォルトでは MSXML3 が入ってないのでいい気分かもしれませんが、そのかわりIE5.5ではXMLのページをちゃんと表示できませんよ。スタイルシート(XSL)の名前空間を昔の暫定的なヤツで書けば部分的には動くものの、そんなのはネスケ4にあわせてHTMLスキン(CSS)を書くような問題外の話だし。Mozilla もXMLは実装途上だし。好むと好まざるとにかかわらず、消去法でIE6しかないような……。それと、GlayMagic が報告した件(2002年3月6日の記事参照)は、対策するかどうかは自己判断としても、いちおう知っておいたほうが良いと思います。さらに、IE6のセキュリティ問題に関する新しいレポートとして、SNS Advisory No.48(日本語)も参考にしてください。(これらの問題もすでに対応されています。)
2002-03-19 公開
2002-03-22 マイクロソフトの情報MS02-013が「2002 年 3 月 4 日 VM 用の累積的な修正プログラム 」として再発表されました。これは Internet Explorer にデフォルトで組みこまれている「Java VM」という機能の欠陥に関するものです。――3月4日にリリースされたJava VMの最新「ビルド 3805」は、そもそも、比較的、特殊なバグを解決するものでした。そのあと、Java VM にさらに別のバグも見つかりました。が、この別の問題も、「ビルド 3805」にバージョンアップすれば(偶然にも?)いっしょに解決するそうです。そんなわけで、最初にまとめを書いたときには「一般にはあまり関係なさそうですが、まあアップデートしとくに越したことはないでしょう」くらいの書き方でしたが、どうやら、もっと切実なパッチになったらしいです。マイクロソフト社は 最大深刻度 : 高。Microsoft Windows を使用しているお客様は最新の Microsoft 仮想マシンにアップグレードして下さい。
と呼びかけてます。
2002-03-29 「MS02-015 : 2002年3月28日 Internet Explorer 用の累積的な修正プログラム」が公開されています(要約情報)。「累積的」パッチは、このMS02-015が現時点での最新となります。
2002-03-30 上記に対応してリンクを修正。
2002-04-02 MSXML3.DLL の問題の修正プログラムが発表されました。
2002-05-16 累積的パッチが更新されたため、スクリプトを修正。
2002-05-17 累積的パッチが更新されたため、記事を修正。「2002 年 5 月 15 日 Internet Explorer 用の累積的な修正プログラム (Q321232) (MS02-023)」が最新の累積的パッチ。
2002-03-18 「綾波育成計画 ぷかぷかレイちゃん」: 偽偽春菜? ていうか、「綾波レイ」原画盗難事件に関して、と並べて見るとおもしろいYO。いわく「私はその原画を初めて見たときに、背筋がゾクっとした感覚を今も忘れません。すごい絵だと思いました。美術館に入っている絵では感じられない感覚でした。そういった原画1枚1枚の積み重ねで、ガイナックスの作品が作られている事を一人でも多く、生の原画を見ていただいて、感じてもらいたいのです。」……と重々しく訴えていた「作品に魂をこめる」ガイナックスであるが、と同時に「ぷかぷかレイちゃん」、「着せ替えゲーム」、「レイちゃんすくい」、「たぶん私は3人目」。「水をかえ、えさをやり、話しかけたりしながら、彼女を育てていくことができる。」
そういえば、「妖精の育て方」という本(妖精復活同盟参照)には「食事のさせかた、排泄物の処理の仕方まで書いてある」。
2002-03-18 「バージョン3」への移行が進む rar書庫ですが、本家WinRAR 3.00 が BETA5 になりました。3.00のベータ版を少し前から実用目的で試していますが、確かに以前の 2.x より圧縮率が目に見えて向上していて「見かけだけでない実質のバージョンアップ」という感じ。分割ファイル名のrar名物、連番拡張子システムも変更になったし。とくに気に入っているのは、自己解凍書庫を作るとき、書庫のアイコンとして自分の好きなアイコンを選べること。 マリーベルの動画を分割する用事があったので、結合用のexeをマリベのアイコンにしたら、いい感じ……
付属文書によると、BETA4 からの変更点は次の通り。コンテクストメニューがサブメニューを含むとき不具合があったのを改善。ある種のパスワード書庫にファイルを追加するとき、必要ないのに同じパスワードを何回も尋ねるダイアログを出していたのを修正。コマンドラインモードの -p(データを暗号化)スイッチの挙動を変更。本来、-pPassword で書庫内ファイルのデータを暗号化(パスワードをかける)、-hpPassword ならさらに書庫のヘッダ情報も暗号化だが、-p だけでも、書庫に埋め込んだコメントに関してはデフォルトで暗号化するようにした(従来は、-pPassword をつけてもコメントはパスワードなしで読めた)。この変更にかかわらず、セキュアな用途では -hp と明示してヘッダ情報まで完全に暗号化することが望ましい。
ARJ, ACE などの「オルタナティブ書庫」は本家GUI版ツールで日本語ファイル名が化けるから日本語圏では実用的でないが、(訂正: 現在の WinAce ではフォントの設定しだいで日本語版Windowsで日本語は無問題、ハングルのファイル名は表示できず。また、WinArj は ARJ の本家でなくサードバーティー製)WinRARならごらんの通り(上の画像)日本語OK。それどころか、日本語、英語以外の文字もちゃんと表示できる。上の画像は英語版だが、日本語版ほか各国語版がある。メニューの翻訳も機械的な直訳でなくこなれていて、分かりやすい。シェアウェアながら、持ってる人は必ず持ってる常備ツール……。ソフトの品質も、ARJ, ACE, SIT なんかより明らかに上だろう(Aceとは互角か)。ノルウェーのOperaをレジストしてもいいと思ってるかたは、フィンランドのRarもいかがっすか?
2002-03-18 EdMaxフリー版がVer2.84.6Fになってました。細かいバグ修正のほか「HTMLメールを表示」をオンにしたときのセキュリティチェックを強化したというので、ユーザはバージョンアップの価値あり。PGPは透過的に使えるし、HTMLメール機能を利用すれば日本語英語以外の文字のメールも表示できちゃうし、フリーのメーラとしては最高峰のひとつでしょう。(Mozillaのメーラもいいですけど)
2002-03-17 「Vectorスパイ」: フィルタつきの「ヘッドラインセンサー」です。Vectorの「新着ソフト一覧 Windows」のページを取得して、そこからフリーソフトだけを抜き出して(笑)見やすい色分けの一覧表を自動作成します。広告バナーなどの情報と無関係の画像は全部カット。ローカルでアパッチを入れてるかた、これ走らせてみませんか。動作原理のスケルトン:
$freesoft = quotemeta('フリーソフト'); $webpage = fopen('http://www.vector.co.jp/vpack/whats/win/index.html', 'r'); while(!feof($webpage)) { $line = fgets($webpage, 4096); if( ereg( "$freesoft.+(<A HREF.+</A>)(.+)<FONT" , $line , $match ) ) { echo "<tr><td>$match[1]</td><td>$match[2]</td></tr>\n"; } } fclose($webpage);
完全なソース例、出力結果例。これはPHP版ですが、もちろんPerlでも書けます。
応用課題: 1時間ごとに自動的にBBCのサイトにアクセス、リンクを深み3まで追跡し、Finland という単語を含む記事を収集、自動的に分類してデータベースに蓄積するスクリプトを作れ。次に同様のスクリプトを自分好みにカスタマイズして、紙の新聞紙が無用であることを証明せよ。(有力な反対意見=新聞紙は犬のふんの始末をするのに必要なのでないか)
2002-03-18 marybell.faireal.netの韓国語版ページに、ビデオ版主題歌とりあえず前半をアップしました。原文と日本語の逐語対訳、発音記号。ページ上部は画像で表示、下部は同じ内容をユニコードテキストで表示させています。