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つの道具だけで何かを作ろうとは思わない。