ファイルをオープンして、先頭から最後まで読んだとしても、読み取れるのはデータフォークにある内容だけであり、リソースフォークなどそのほかのフォークの内容は読み取れない。これは便利な一方、ファイルの操作としては不便なこともある。例えば、リスト1のような、とても単純なファイルコピーコマンドがあるとしよう。
int main( int argc, char *argv[])
{
int c;
FILE *fp_r = fopen( argv[1], "r" );
FILE *fp_w = fopen( argvp[2], "w" );
while( EOF != ( c = fgetc( fp_r ) ) )
fputc( c, fp_w );
fclose(fp_r);
fclose(fp_w);
}
通常のファイルならこのプログラムでコピーできるが、リソースフォークを含むHFS Plus上のファイルではリソースフォークやファイルタイプ、クリエータといった独自の情報が欠損してしまう。UNIXのセマンティックスと整合性を損なわないようにデータフォーク以外をアクセスするための最初の手段が、パスの拡張だ。
Mac OS Xでは、通常ファイル自身の名前で終わるパスを伸ばし、どのフォークにアクセスするかを切り替えられる。例えば、
/path/to/forked_file.dat
の場合、このパスではデータフォークにアクセスできるが、
/path/to/forked_file.dat/..namedfork/rsrc
とすることでリソースフォークへのアクセスが可能になる。あまり意味はないが、
/path/to/forked_file.dat/..namedfork/data
とすればデータフォークに明示的にアクセスできる。
この機能を利用することで、UNIXコマンドからリソースフォークをアクセスできるようになるのだ(コラム2)。なお、この問題についてはMac OS X 10.4 (以下、Tiger)において、拡張属性(Extended Attribute)の形でさらにエレガントな解答が用意されている。
HFS Plusには/..namedfork/を利用したパスの拡張や、大文字小文字を区別しないファイルシステムなど通常のUNIXとは異なるものがあり、思わぬところでセキュリティホールが生じてしまう。
例えば、Apacheの設定でリストAのようなアクセス制限をしていても、
http://myserver/foo.HtMl
などと大文字小文字を交ぜられたり、
http://myserver/foo.html/..namedfork/data
とされると、アクセスが制限されているファイルへのアクセスが成功する恐れがある。
このため、Mac OS X標準搭載のhttpd.confにはリストBが追記されている。これは見てのとおり、パスの拡張によるアクセスやリソースフォークへのアクセスを禁止するものだ。
また、mod_hfs_apple.so*というモジュールがデフォルトで組み込まれている。このモジュールはURLの大文字小文字を正規化することで、大文字小文字が異なるだけのファイルへのアクセスを禁止するというものだ。
これらは標準搭載のApacheで実現されており、通常気にする必要のないことではあるが、もし何らかの理由で自前でコンパイルしたApacheや独自の設定を使う場合は注意する必要がある。
Copyright © ITmedia, Inc. All Rights Reserved.