JavaScriptにおけるローカルファイルアクセス権限のポリシー
以下の記述はjQueryを利用したときに発見したものなのですが、XMLHttpRequestももちろん影響を受けますし、その他にもJDKのJavadocなどframeで別ページを開いているようなものが、別ウィンドウ(別タブ)で表示されるようになる、といった変化が動作に現れるようです。
Web系の技術って、(開発に携わっていると大丈夫なんでしょうけど、)Webに書いてあることは仕様が決まったり当時騒がれてた時の情報だったりして、現在の仕様がどうなってるのかフォローアップするのが中々大変ですね…
JavaScriptにはsame-origin policy(オライリーのJavaScript第5版では”同一出身ポリシー”と訳されている)というものがある、ってのは理解していました。しかし、これってローカルファイルについては何も言っておらず、実際はどうなっているのか疑問でした。で、今回ハマったのでそのことを。
ローカルに置いたJavaScriptの中で、jQueryのload関数でローカルhtmlに表示を挿入しようとしました。
試してみたところ、Firefox3.6.4では想定通り挿入されるのですが、Google Chrome5.0.342.9では挿入されない。same-origin policy的にはなんとなく両方ローカルファイルだから大丈夫なんだろう、と考えていましたが実際ブラウザ間に差異が出たので調べてみました。
マイコミジャーナルの記事(及び原文”Security in Depth: Local Web Pages”)によると、
ローカルファイルに対しては「Same origin policy」は必ずしも有効になっておらず、ブラウザごとに対応はまちまちだ。
ということだそうです。
で、今回問題のGoogle Chromeのポリシーの記述を見ると、
ローカルWebページからのアクセスをローカルファイルシステム上のファイルに限定[中略]。開発の利便性や現状を加味してローカルWebページにおけるJavaScriptの実行は許可
ということで、Google Chromeにおいても、ポリシー的には動作しても良さそうに書いてあります。
その後、そういうことはTiddlyWiki(Wikipediaによる解説)を見ると良いよ、と教えてもらったので、検索してみたところ、TiddlyWikiをGoogle Chromeで利用する際の問題点が書かれたページがありました。
このページに記載されている内容のうち、--allow-file-access-from-files というオプションが気になったので調べてみたところ、5.0.335.0より動作が変わったようです。日付は2010年2月になっているので、結構最近ですね。
every HTML document hosted on a local file:// URI now lives in a unique domain. Old behavior can be re-enabled with the new flag --allow-file-access-from-files.
ローカルのファイルは全部バラバラの出身とみなすよ、ということでしょうか。ちなみにこの変更の元になったバグレポートはIssue4197かな?
ともかく、上記の起動引数を追加してやることでGoogle Chromeでも期待する動作になってくれました。
けど、ユーザにこんな面倒なことさせられないよな…
あと、JavaScriptってこういう場合には例外出してくれないんですね。JavaだとSecurityExceptionみたいなのを送出しそうですが。
« さきゅばす拡張とcoroidのCentOS対応 | トップページ | ハードディスク運が悪い その3 »
この記事へのコメントは終了しました。
コメント