IEのローカルファイルをXHRでどこまで読みとらせるか
ローカルのHTMLファイルからどこまで読み取れるか選手権 2011 - 金利0無利息キャッシング – キャッシングできます - subtech を読んでの補足。
IE9 on Windows 7 においてXHRを使ってローカルファイルを読み取る場合について、「許可するとやりたい放題」と書かれているとおり、IEが表示する警告をいったん「許可する」側に選択するとhtml内の JavaScript (あるいはVBScript)において通常のローカルのプログラムと同様にあらゆる操作が可能になります。(写真は英語版IE9)
これは、IE6 / XP SP2 以降で導入された「ローカルコンピュータのロックダウン」が解除された状態になり、WSHやHTAと同様に、ローカルリソースへのアクセスや任意のActiveX Objectの生成を含め任意のコード実行が可能な状態になったということです。
ローカルに置いておくHTMLで部分的にJavaScriptを使ってレンダリングさせたいけど、そこまで制約を緩めたくないという場合には、インターネットゾーンでファイルを開かせることで通常の http で開く html と同様の制約を課すことができます。ローカルに保存したhtmlファイルをインターネットゾーンで開かせるには、以下の二つの方法があります。
- html 内で saved from url を指定する
- ZoneIdをHTMLファイルに与える
どちらでも効果は変わりませんが、前者のほうが圧倒的に簡単かと思います。
html内で saved from url を指定するには、以下のHTMLコメントの記述をHTML内に含めるようにします。
<!-- saved from url(0023)=http://www.example.com/ -->
ZoneId を付与するには、notepad test.html:Zone.Identifier などとすることでメモ帳が立ち上がるので
[ZoneTransfer] ZoneId=3
と書いて保存します。ZoneId はNTFSの代替データストリームを利用していますので、USBメモリへのコピーやzipなどに圧縮、展開することで抜け落ちてしまうことがあります。
これらの操作により、そのhtmlファイルを開いた時には www.example.com からダウンロードされたとみなされ、example.com と同様にインターネットゾーンで動作するため、same origin policyをはじめ通常のブラウザと同様に各種の制約が課されることになります。
Windows 7上のIE9において、ローカルに保存し、file:// で開いたhtmlファイルを、ローカルコンピュータゾーンでJavaScriptを動作させた場合と、インターネットゾーンで動作させた場合の制約の差を以下にまとめておきます。
ローカルコンピュータゾーン | インターネットゾーン | |
---|---|---|
指定方法 | IEの出す警告にて許可するを選択 | save from urlの追加 |
同一ディレクトリ内のファイル | 読み取り可能 | 読み取り可能 |
上位ディレクトリ内のファイル | 読み取り可能 | 読み取り不可 |
クロスドメイン(http)なiframeのcontentWindow.document.innerHTML | 読み取り不可 | 読み取り不可 |
外部の、httpなiframeのinnerHTMLは予想に反してローカルコンピュータゾーンでも読みとれなかったけれど、他の方法(例えばXHRを使うなど)であれば読みとることは可能だと思います。あと、XHRは new XMLHttpRequest() の場合はローカルコンピュータゾーンでもfile://なリソースを読みとることはできないので、テストには new ActiveXObject("Microsoft.XMLHTTP") を使用しました。
ちなみに、この手の話題はブラウザ開発者の間ではよく知られてるけどブラウザの拡張開発者やブラウザコントロールを使ったアプリケーションの開発者にはあまり知られていないような気がするのでもうちょっと知っておいて欲しい気もする(JVN#257C6F28: Internet Explorer コンポーネントを使用するアプリケーションにおけるセキュリティゾーンの扱いに関する脆弱性 とか)。
で、結局何が言いたいかというと、IE9は開いたHTMLがどのゾーンで動いてるかステータスバーを表示させたとしてもわからないので、誰か確認する方法教えて!
参考文献: