* [CODE(URI)[file:]] URI scheme [57] [[DOS]] ・ [[Windows]] 系の [CODE(URI)[file:]] URI の形式の色々: - 通常のファイル -- [CODE(ABNF)[[[authority]]]] の部分 --- 空の [CODE(ABNF)[authority]] ([SAMP(URI)[file:///c:/]] など) --- [CODE(URI)[[[localhost]]]] ([SAMP(URI)[file://localhost/c:/]] など) --- ドライブ名 ([SAMP(URI)[file://c:/]] など) --- なしで、斜線1つから ([SAMP(URI)[file:/c:/]] など) --- なしで、直接ドライブ名に ([SAMP(URI)[file:c:/]] など) -- ドライブ名の部分 --- 大文字か、小文字か ---- 大文字 ---- 小文字 --- 記号 ---- コロン ([SAMP(URI)[file:///c:/]] など) ---- [[百分率符号化]]されたコロン ([SAMP(URI)[file:///c%3A/]] など) ---- 縦棒 ([SAMP(URI)[file:///c|/]] など) ---- [[百分率符号化]]されたコロン ([SAMP(URI)[file:///c%7C/]] など) ---- 省略 ([SAMP(URI)[file:///]] など) -- 経路 (ファイル名・ディレクトリ名) --- 区切り文字 ---- 斜線 ([SAMP(URI)[file:///c:/windows/explorer.exe]] など) ---- 逆斜線 ([SAMP(URI)[file:///c:\windows\explorer.exe]] など) ---- 百分率符号化された逆斜線 ([SAMP(URI)[file:///c:%5Cwindows%5Cexplorer.exe]] など) ---- 混在している場合 ---- 複数個連続する場合 ([SAMP(URI)[file:///c://windows///explorer.exe]] など) --- 大文字と小文字 ---- ファイル・システムにおける大文字・小文字の使い分けと同じもの ([SAMP(URI)[file:///C:/WINDOWS/EXPLORER.EXE]] など) ---- ファイル・システムにおける大文字・小文字の使い分けと違うもの ([SAMP(URI)[file:///c:/wIndoWs/eXplorer.eXe]] など) --- 百分率符号化 ---- 百分率符号化されたもの ----- 使用しているシステムの内部文字コード ([[Windows-31J]] や [[UTF-16]] など) によるもの ----- 使用しているシステムの外部文字コード ([[Windows-31J]] など) によるもの ----- [[UTF-8]] によるもの ---- 百分率符号化されていないもの ----- URI の予約文字が含まれないもの ----- URI の予約文字が含まれるもの ([SAMP(URI)[file:///C:/Example #1/Test #2.txt]] など) ----- URI で使えない文字が含まれるもの ([SAMP(URI)[file:///C:/Program Files/]] など) --- [[長いファイル名]] ---- 普段使用されるファイル名 ([[長いファイル名]]) ---- [[VFAT]] などにおける互換性のための[[短いファイル名]] ---- 経路中に混在する場合 --- ディレクトリを表す場合、末尾に経路区切り記号をつけるか否か - 特殊なファイル・経路 -- [CODE(file)[\\.\]] から始まる経路に対応するもの ([[Win32]] で[[装置]]ファイルに対応) -- [CODE(file)[\\?\]] から始まる経路に対応するもの ([[Win32]] で局所ファイルに対応) -- 末尾が [CODE(file)[.]] や[[間隔]] (任意個) である経路に対応するもの ([[Win32]] [[API]] で普通無視される) -- ドライブ指定以外で [CODE[:]] を含む経路に対応するもの ([[NTFS]] の [[stream]] の指定に対応) -- [[装置]]ファイル名が含まれるもの -- 仮想ファイル (>>41 など) - ネットワーク上のファイル -- [CODE(ABNF)[authority]] を使用 ([SAMP(URI)[file://host/path/to/file]] など) - 相対参照 (真の相対参照, 絶対 URI 参照の仲の [CODE(ABNF)[[[path]]]] が実は相対参照) -- [CODE(URI)[.]] (同じ階層) -- [CODE(URI)[..]] (一つ上の階層) -- [CODE(URI)[...]] (二つ上の階層) など、更に多い場合 -- [SAMP(URI)[foo/not-found/../baz]] ([SAMP(file)[not-found]] は実は不存在) のような場合 -- ドライブを超えた相対参照 (>>48 など) -- [CODE(ABNF)[[[scheme]]]] や斜線はあるが、実は相対参照 (>>52 など) - [[Cygwin]] のような [[Un|x]] 風システムを使用している場合 -- [SAMP(file)[/cygdrive/c/windows/]] のような経路に対応するもの [58] '''[[Un|x]] 系の [CODE(URI)[file:]] URI の色々''': - 絶対経路によるファイル -- [SAMP(URI)[file:///path/to/file]] -- [SAMP(URI)[file://localhost/path/to/file]] -- [SAMP(URI)[file://path/to/file]] -- [SAMP(URI)[file:/path/to/file]] -- [SAMP(URI)[file:path/to/file]] (絶対経路? 相対経路?) - [[symbolic link]] を辿るか否か - [[home directory]] を表す表現 -- [SAMP(URI)[file:~user/path/to/file]] -- [SAMP(URI)[file:///~user/path/to/file]] ほか各種 -- [CODE(URI)[~]] を [CODE(URI)[%7E]] としたもの各種 [59] '''照会''': 局所ファイルを[[実行]]させる機能がある[[利用者エージェント]]は [CODE(ABNF)[[[query]]]] の使用を認めていることがあります。 [[#comment]] ** file: 以下のさまざまな表現形式 [8] 特に [[Windoze]] 上の [[UA]] において、 file: 以下のあらわしかたには様々なものがありました。 ,[[UA]] ,file: ,== ,== ,file:// ,== ,== ,file:/// ,== ,== ,file://localhost/ ,== ,== ,メモ , ,C|/ ,C:/ ,"C:\\" ,C|/ ,C:/ ,"C:\\" ,C|/ ,C:/ ,"C:\\" ,C|/ ,C:/ ,"C:\\" , ,M$IE2.0 ,○ ,○ ,○ , , , ,○ ,○ ,○ , , , , ,11111 , , , , , , , , , , , , , [[#form:',%text(id=>ua);,%check;,%check;,%check;,%check;,%check;,%check;,%check;,%check;,%check;,%check;,%check;,%check;,%text(id=>condition,size=>5); %submit(label=>"追加");':',%text(source=>ua);,%iif(source=>_no1,true=>○);,%iif(source=>_no2,true=>○);,%iif(source=>_no3,true=>○);,%iif(source=>_no4,true=>○);,%iif(source=>_no5,true=>○);,%iif(source=>_no6,true=>○);,%iif(source=>_no7,true=>○);,%iif(source=>_no8,true=>○);,%iif(source=>_no9,true=>○);,%iif(source=>_no10,true=>○);,%iif(source=>_no11,true=>○);,%iif(source=>_no12,true=>○);,%text(source=>condition);':'%require(ua);']] *** file://C|/*/* [[#form:'%text(id=>ua,label=>"[[UA]]"); %check(label=>対応している,default,id=>support); %text(id=>condition,label=>詳細,size=>10); %submit(label=>"追加");':'-[%index;] \'\'%text(source=>ua);\'\': \'\'\'%iif(source=>support,true=>対応。,false=>未対応。);\'\'\'%text(source=>condition);':'%require(ua);']] *** file://C:\*\* - [54] ''file://C:'': '''対応。''' - [56] ''11'': '''対応。''' [[#form:'%text(id=>ua,label=>"[[UA]]"); %check(label=>対応している,default,id=>support); %text(id=>condition,label=>詳細,size=>10); %submit(label=>"追加");':'-[%index;] \'\'%text(source=>ua);\'\': \'\'\'%iif(source=>support,true=>対応。,false=>未対応。);\'\'\'%text(source=>condition);':'%require(ua);']] *** file:///* [[#form:'%text(id=>ua,label=>"[[UA]]"); %check(label=>対応している,default,id=>support); %text(id=>condition,label=>詳細,size=>10); %submit(label=>"追加");':'-[%index;] \'\'%text(source=>ua);\'\': \'\'\'%iif(source=>support,true=>対応。,false=>未対応。);\'\'\'%text(source=>condition);':'%require(ua);']] *** file:///C|/*/* - [4] ''Infomosaic/2.0.0 Final Beta J4 (Windows x86)'': 対応。 - [6] '' MosaicView/2.0009 Win32 NEC/9'': 対応。 [[#form:'%text(id=>ua,label=>"[[UA]]"); %check(label=>対応している,default,id=>support); %text(id=>condition,label=>詳細,size=>10); %submit(label=>"追加");':'-[%index;] \'\'%text(source=>ua);\'\': \'\'\'%iif(source=>support,true=>対応。,false=>未対応。);\'\'\'%text(source=>condition);':'%require(ua);']] *** file:///C:\*\* - [10] ''MSIE 2.0'': 対応。アドレスバーはすぐに >>9 に書き換えられる。 [[#form:'%text(id=>ua,label=>"[[UA]]"); %check(label=>対応している,default,id=>support); %text(id=>condition,label=>詳細,size=>10); %submit(label=>"追加");':'-[%index;] \'\'%text(source=>ua);\'\': \'\'\'%iif(source=>support,true=>対応。,false=>未対応。);\'\'\'%text(source=>condition);':'%require(ua);']] *** file://localhost/* - [1] しばしば使われる。 - [5] [[JustView]] [[#form:'%text(id=>ua,label=>"[[UA]]"); %check(label=>対応している,default,id=>support); %text(id=>condition,label=>詳細,size=>10); %submit(label=>"追加");':'-[%index;] \'\'%text(source=>ua);\'\': \'\'\'%iif(source=>support,true=>対応。,false=>未対応。);\'\'\'%text(source=>condition);':'%require(ua);']] *** file://network-host-name/* - [2] [[WinIE]] では、 [CODE[\\network-host-name\*]] の参照として使用出来る。 - [3] [[Mozilla]] on [[Win32]] では不可。 [[#form:'%text(id=>ua,label=>"[[UA]]"); %check(label=>対応している,default,id=>support); %text(id=>condition,label=>詳細,size=>10); %submit(label=>"追加");':'-[%index;] \'\'%text(source=>ua);\'\': \'\'\'%iif(source=>support,true=>対応。,false=>未対応。);\'\'\'%text(source=>condition);':'%require(ua);']] *** file:C:\*\* - [9] ''Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)'': 対応。この形式を実装したのは、おそらく M$IE が最初でしょう。 [[#form:'%text(id=>ua,label=>"[[UA]]"); %check(label=>対応している,default,id=>support); %text(id=>condition,label=>詳細,size=>10); %submit(label=>"追加");':'-[%index;] \'\'%text(source=>ua);\'\': \'\'\'%iif(source=>support,true=>対応。,false=>未対応。);\'\'\'%text(source=>condition);':'%require(ua);']] *** Windoze の特殊フォルダの表現 [41] [[Windoze]] ([[WinIE]]) では、特殊フォルダをあらわす次のような形式 ([SAMP(URI)[file:///::{[VAR[clsid]]}]]) が使えます。 この機能は遅くても [[Win2k]] で実装されています。 例: :[[My Document]]:[SAMP(URI)[file:///::%7B450d8fba-ad25-11d0-98a8-0800361b1103%7D]] :[[My Computer]]:[SAMP(URI)[file:///::%7B20D04FE0-3AEA-1069-A2D8-08002B30309D%7D]] :[[Network Neighborhoods]]:[SAMP(URI)[file:///::%7B208D2C60-3AEA-1069-A2D7-08002B30309D%7D]] フォルダによっては [[CLSID]] 表現ではなく、 [[shell:]] scheme が使用されます。 - [52] [[desktop.ini]] では [CODE(URI)[file://Folder Settings\folder.htt]] とか [CODE(URI)[file://folder.htt]] とか書けるらしいです。。。 [[#comment]] ** 実装 *** Mosaic Netscape 0.9 Beta (Win16 版 on Win95) [13] 実験してみますた。 [CODE[file:///]] でドライブ一覧 ([CODE[A|/]] とかが並んでる。) が出てきます。 Location: 欄に [CODE[file:///C|/]], [CODE[file:///C:/]], [CODE[file:///C%7C/]] と入力すると望んだものが出てきますが、 [CODE[file:///C:\]] とすると busy で死んでしまいました。 [CODE[file://]] はだめでした。 - [45] >>13 NN 2.01 でもやっぱり固まります。 [[#comment]] *** memo [14] [[Lynx]] では [[HOME]] を表す [[~]] が使えます。 [CITE[URL Schemes Supported in Lynx]] - [44] NN2 ですが、 [CODE(URI)[file:///c:/]] と [CODE(URI)[file:///C|/]] は、得られる効果は同じですが、違うものとして扱われているようです。 (redirect みたいな関係にはないようです。) [SAMP[テ゛ィレクトリ /C%3A]] とか [SAMP[/%7C]] とか「ちゃんと」表示されます。 - [48] 相対 URI [SAMP(URI)[../D|/foo/]] (基底 [SAMP(URI)[file:///C|/]]) のような表現が使える実装もあるそうです。いやいや、これは URI 一般構文から見ればぜんぜん不思議でなく、むしろこうかけなければなりませんが。 [53] Un|x 版 Mozilla 1.2.1 ですが、[CODE(ABNF)[authority]] は常に無視して [CODE(URI)[localhost]] であるかのように扱ってくれます。何か変ですし、 [CODE(URI)[/]] が3本のつもりで2本にしてしまっても間違いに気づかずに変な結果が出て萎えます。 他の版でも同様な結果だったような気がしますがたしかめていません。とりあえず手元の版ではこうなりました。 ([[名無しさん]] [WEAK[2004-05-10 05:13:16 +00:00]]) [42] ほとんど (すべて?) の実装では、[[ディレクトリ]]・ [[フォルダ]]の最後に [CODE(URI)[[[/]]]] があってもなくても同義と解釈します。 [43] [[ハードリンク]], [[シンボリックリンク]]は多分そのシステムでの普通の扱い同様追いかけてくれます (ハードリンクは本物と区別できないかもしれませんがね)。 [[ショートカット]], [[エイリアス]], [[シャドウ]]などについても同様の実装があるかもしれません。 [WEAK[(ないかもしれません。)]] [46] [[Perl]] の実装である [CODE(perl)[[[URI::file]]]] は、 [CODE(ABNF)[[[authority]]]] で[[装置]]名その他 [WEAK[([[DOS]] の[[ドライブ]]名とか。)]] を書くのは良い考えじゃないか? と述べています。このモジュールは意図的に [SAMP(URI)[file:/usr/bin/perl]] みたいな書き方を使ってるみたいです。 - [49] [[w3m]] では、使える場面は限られますが、変数 [VAR(URI)[$LIB]] が使えます。例: [SAMP(URI)[file:///$lib/foo/bar]] - [50] また、 w3m にはやはり限られますが、 [CODE(URI)[cgi-bin]] という仮想ディレクトリを設定で作れます。 [SAMP(URI)[file:///cgi-bin/foo.cgi]] を [SAMP(file)[/path/to/foo.cgi]] に対応させられます。 [51] そして注目すべきは、 w3m の [[local CGI]] 機能の都合上、 [CODE(URI)[file:]] URI でも[[照会]]が使われるのです。 [55] 絶対 URI だけではなくて、相対 URI もいろいろ。 [[RFC 1808]]/[[RFC 2396]] 的にはあってはならないことですが。 たとえば Windows では [CODE(URI)[/]] drive の根になるのか、その一つ上の階層(謎)になるのか、とか、 [CODE(URI)[\]] も path の区切りになるのか、とか。 [CODE(URI)[c:/]] みたいなのを [CODE(URI)[file:///c:/]] の意味にとるのもありそう。 [67] [CITE[freedesktop.org - Standards/file-uri-spec]] [[UNIX]]環境における[CODE(URI)@en[[[file]]:]] [[URI]]と[[ファイル名]]の写像の仕様を作ろうとしているようですが、今のところ何もありません。 ([[名無しさん]] [sage] [WEAK[2006-01-03 05:37:05 +00:00]]) [68] [CITE[Commons VFS - Supported File Systems]] [[UNIX]]と[[Windows]]の[[ファイル名]] ([[UNC]]を含みます。) は、[CODE(URI)@en[[[file]]://]]を最初につけるだけで[[URI]]にしています。 ([[百分率符号化]]はします。) [[Windows]]の場合、 [CODE(char)[\]]と[CODE(URI)@en[/]]はどちらでもよいようです。 ([[名無しさん]]) [69] [CITE[Checking document()]] [[XSLT]]の[CODE(XPathf)@en[[[document]]()]][[関数]]の実装状況 ([[名無しさん]]) [71] [CITE[The xdg April 2004 Archive by thread]] >>67 についての議論です。 - 基本的には[[RFC 1738]]の構文を採用します。 - 既存の実装との互換性のため、 [CODE(URI)@en[[[file]]:/[VAR@en[path]]]] 形式も理解できるようにします。 - [CODE(ABNF)@en[[[authority]]]]を明示する時は ([CODE(URI)@en[[[localhost]]]]か) [CODE(C)@en[[[gethostbyname]]]]で得られた値を使います。 - [[UNIX]]の[[ファイル名]]は[[バイト列]]なので、[[UTF-8]]などではなく、実際の[[ファイル名]]の[[バイト列]]を使います。 という感じのようです。 ([[名無しさん]]) [72] [[KDE]]は動的に生成された内容に対して[CODE(URI example)@en[file:/cgi-bin/helpindex]]のような[[URI]]を使っています。 ([[名無しさん]] [sage]) [73] [CITE[URL Schemes Supported in Lynx]] ([[名無しさん]] [sage]) [76] [CITE[IEBlog : File URIs in Windows]] ([[名無しさん]] [WEAK[2006-12-06 23:31:28 +00:00]]) [[#comment]] ** 相互運用性 [58] ここまで見てきたように、 [CODE(URI)[file:]] URI scheme は標準不在の状況です。どうせ局所的にしか使わないのだからどうでもいいだろうという言い訳のもとに最早収拾がつかない状況に陥っています。 相互運用性なるものは期待するだけ無駄でしょう。 [[#comment]] ** 安全性 [16] [CITE[8-1. Windowsパス名の落とし穴]] [[Windows]] の[[ファイル名]]の色々な表現について。この記事は直接 [CODE(URI)[file:]] の問題を扱ったものではありませんが、 余り気にせずに実装すると [CODE(URI)[file:]] URI でも同じ問題を抱えることになります。 [17] >>16 の問題が広く取り上げられた例として、 [CODE[[[CON]]]] [CODE[CON]] 問題がありました。 - [18] ''スラッシュドット ジャパン | c:\auxでIEがクラッシュする脆弱性'' - [19] [[Un|x]] でも、 [[Mozilla]] で [CODE(URI)[file:///dev/zero]] を見ようとすると困ったことになるとか、同様の問題があったりもします。 - [20] 流石に [[WinIE6.0]] でも Mozilla 1.4 でも、 [SAMP(URI)[file:///?/c:/windows/]] とか [SAMP(file)[\\?\c:\windows]] とかは機能しないみたい。 [60] '''外部文書からの参照''': 信頼できるか不明な相手から送られてきた文書中に [CODE(URI)[file:]] URI が記述されていた場合、それをどう処理するかは注意が必要です。 例えば、埋込み[[画像]]として[[利用者]]の手元のファイルが指定されていると、 利用者は外部から送られてきた文書に自分の手元の画像が含まれていると思って混乱するかもしれません。 [[Webブラウザ]]で[[ディレクトリ]]を指定すると手元のファイルの一覧表示が行われるように実装されていることを期待して、 利用者の環境が外部から丸見えであるかのように錯覚させて安全対策と称した怪しいソフトウェアを売り込む怪しい Web サイトも実在します。 心理的な[Q[攻撃]]だけではなく、実際に攻撃することも可能です。 例えば埋込み画像として [[PC/AT互換機]]+ [[DOS]]・[[Windows]] では[[フロッピー・ディスク]]のドライブを表す [SAMP(URI)[file:///a:/fake.jpg]] のような指定を行うと、 [WEAK[(ファイルが実在するかに関わらず)]] フロッピー・ディスクに探しに行くと思われるので、 突然カタカタと音が鳴り出して利用者は不安・不快に思うかもしれません。 数が多ければ[[ブラクラ]]や [[DoS]] ともなり兼ねません。 [61] '''URI を指定できる公開サービス''': [[URI]] を指定して、その URI によって[[取出し]]できる[[資源]]に対して操作するような公開のサービスでは、 意図せずに [CODE(URI)[file:]] URI によって[[鯖]]内部のファイルを閲覧・ 利用されてしまうことがないように注意が必要です。 特に URI から取出しを行うために[[ライブラリ]]を使っている場合、 [CODE(URI)[http:]] URI だけを使うことを想定していても [CODE(URI)[file:]] URI の場合の処理も実装されていることがよくあります。 [63] '''外部への情報提供''': [[転送プロトコル]]や[[スクリプト]]などを介して[[履歴]]情報などを提供する場合、 個人情報保護 (と場合によってはシステムの安全) の観点から[Q[外部]]と考えられるところには情報を送らない (取出せない) ように配慮が必要です。 例えば、 [[HTTP]] にはリンク元の [[URI]] を記述する [CODE(HTTP)[[[Referer]]:]] という[[頭欄]]がありますが、 [CODE(URI)[file:]] URI の文書から [CODE(URI)[[[http]]:]] URI の文書へのリンクを辿ったような場合には [CODE(URI)[file:]] URI を [CODE(HTTP)[Referer]] として送るべきではありません。 古い[[利用者エージェント]]はこの配慮を怠っていたものがありましたが、 最近の [[Webブラウザ]]は注意しているようです。 文書内のリンク以外では[[栞]]や[[履歴]]や同時に表示している別の文書へのスクリプトからのアクセスなどで注意が必要です。 [64] '''[CODE(URI)[file:]] は安全とは限らない''': 普通 [CODE(URI)[file:]] URI は局所ファイルを表しますから比較的安全だと考えがちですが、 必ずしもそうとは言えません。 [CODE(ABNF)[[[authority]]]] は実は何でも書けますから近くのネットワーク上のホストかもしれませんし、 知らない遠くの[[ファイル鯖]]かもしれません。 たとえ [CODE(URI)[localhost]] でも、局所ファイル・システム木に mount されたネットワーク上のファイル庫である可能性はざらにあります。 [[#comment]] ** 例 - [11] [CODE[file:/path/to/something]] - [12] ''Another HTML-lint : Explanation'' ちょっとだけ参考になる例があります。 - [15] [SAMP(URI)[file://\\host\sharename\dir\file]] (WinIE) - [47] [SAMP(URI)[file://./backofficestorage//MBX//Calendar]] [SRC[[[Microsoft]]]] [[#comment]] ** メモ [62] [[Web]] で公開されている [[著述工具]]によって作成されたとおぼしき [[HTML文書]]で、 [[画像]]の参照先や[[リンク]]先が [CODE(URI)[file:]] URI で[[閲覧者]]には何も見れないことがしばしばあります [WEAK[(製作者の手元では正しく表示されるので気づかないのでしょう)]]。 著述工具は普通作成した文書を何らかの形で公開することを想定しているはずですから、 URI が [CODE(URI)[file:]] であるなら保存時に警告するなど配慮するべきです。 また、著述工具や Web ブラウザは著者のために [CODE(URI)[file:]] URI が機能しないモードを [WEAK[(マークの誤り回復を行わないなどの機能と共に)]] 用意すると便利かもしれません。 [65] [[Firefox]] は各システム環境の標準の[[文字コード]]で[[百分率符号化]]するみたいです。 ([[名無しさん]] [sage] [WEAK[2005-12-25 13:39:58 +00:00]]) [66] [[Firefox]] on [[Win32]] で[[LAN]]上の別計算機の[[ファイル]]を開くと、[CODE(URI example)@en[file://///host/path/to/file]]のような、[CODE(URI)@en[[[file]]:///]]の後に[[UNC]]の[CODE(file)[\]]を[CODE(file)@en[/]]にしたようなものが[[URI]]となるようです。 ([[名無しさん]] [sage]) [70] [CITE@en[draft-hoffman-file-uri]] ([[名無しさん]] [sage]) [74] [CITE[The 'file' URI Scheme Update Project.]] ([[名無しさん]]) [[#comment]] * memo [75] [CODE(HTMLe)@en[[[input]]]] [CODE(HTMLa)@en[[[type]]]] [CODE(HTML)@en[[[file]]]] → [[[CODE(HTMLe)@en[input]]//[CODE(HTML)@en[file]]]] ([[名無しさん]] [sage])