Kenji Arisawa
E-mail: arisawa@aichi-u.ac.jp
Aichi University
Kurozasa 370, Miyoshi-cho
Aichi, Japan
2000/11/04
Plan9 の香り
CGI tools
ツールに対するUNIXの基本思想は、幾つかのツールを組み合わせてより大きなツールを
組み立てることにある。シェルはそれを行うための基本的な機能を提供し、他の、特定
目的に特化したツールをシェルは上手に繋ぎ合わせる。
ところが、Web サーバの CGI ツールに関しては、UNIX のこうした優れた方法論が捨て
られ、Perl とか Python とか言った巨大ツールが幅を利かしている。何故だろうか?
それは、シェルを土台とする UNIX の方法論がセキュリティ上の問題のために採用し難
いからである。
例を挙げよう。
ブラウザ側から送られた form データを受け取るのに、(パーサを通して) 例えば
query_string='user=alice age=18'
のようなデータを受け取る。そして shell はこれを基に
user=alice
age=18
の2つのコマンドを実行しようとする。そしてこの場合に shell に残された唯一の手段
は
eval $query_string
である。
eval を使う方法が、本に解説され、(最近の本は読んでいないが、今もそうかも知れな
い)、そしてセキュリティの穴になってきた。しかし他に良い方法がないのである。
(聡明な読者は、良い方法を知っているかも知れない。その場合には知らせて貰いたい)
もしもパーサが結果をファイルに書き込む事を許されるなら、問題はないのである。し
かし今度もまたセキュリティ上の問題が発生する。つまり他のプロセスからの覗きを防
ぐ事ができないのである。
こうした問題を解決するには、全てを1つのプログラムによって処理すればよいと言う事
になり、何でもできる Perl や Python が選ばれる事になる。
Plan9 ではプログラムは環境変数を親プロセスに渡すことができる。
この性質を利用した CGI ツールは、Forsyth (forsyth@caldo.demon.co.uk) が
formenv の名前で彼の作成した Plan9 用のサーバに添えている。
つまり
formenv
を実行すれば自動的に目的が果たせると言う訳だ。
しかし環境変数には 16KB を越えるデータを入れる事はできない。ファイルのような大
きなデータを扱うには別の方法が要求される。
この場合の一番てっとり早い方法はファイルへの書き込みである。
幸い Plan9 では RAMディスクが利用できる。
ramfs
を実行すると、RAMディスクが生成されて /tmp にマウントされる。しかも、この内容は
他のプロセスグループからは見えない。そして、CGI の処理が終れば自動的に消される。
我々の目的にぴったりである!
筆者は最近 form データとしてファイルを扱う必要に迫られ、RAMディスクを利用した
formparse
を作成した。formparse は筆者のサーバ
ftp://plan9.aichi-u.ac.jp/cgitools/
に置いてある。
Plan9 では標準シェル rc の出来がよいので、殆どの作業を rc だけでやっていける。
Plan9 では CGI スクリプトにおいても UNIX の思想が生きているのである。
筆者は、時には、awk とか sed とか、そして最悪の場合には lex を使用しているが、
大工が1つの道具だけで仕事をしない様に、1つの道具だけで何かを作ろうとは思わない。