[ホーム] -> [SSI 実験室] |
プログラムで最初にやることといえば、当然 K & R の伝統に従って「Hello World」を表示させることです。これもその例に漏れず、SSI で「Hello World」を表示させてみようと思います。あ、とその前に断っておきますが、簡単な html 言語を、知っていることを前提として話をさせてもらいます。
実際のところ、SSI で Hello World を表示させるのは、すごく簡単です。html ファイルの、任意の場所で次のような文字列を入れておけば済むだけです。
<!--#exec cmd="echo Hello World"-->
これを入れると、入れたところに「Hello World」と表示されます。全体の html は サンプルソース を参考にして下さい。「なんだ、だったら SSI を使わず直接文字を書いたらいいじゃないか」と、思うのはもっともです。この SSI の例の真のすごさ(恐ろしさ)は別のところにあります。
上の例で、SSI の命令は、「exec cmd
」の部分です。では、その後の「echo Hello World
」はどれが解釈したかというと、サーバのシェルが解釈しているのです。UNIX に詳しい人なら、この説明で、直ぐにピンとくると思います。exec cmd
命令では、その後に指定された値が、UNIX のコマンドプロンプトに渡され、標準出力(STDOUT)に出力された文字が、html の一部として表示されるのです。UNIX を触ったことのない人に説明すると、プログラムを起動した際に画面に表示される文字が、そのまま html の一部として表示されると思って下さい。直ぐに分かると思いますが、これは、ほぼ何でも出来ることになります。「echo Hello World
」のかわりに「who
」と指定すれば、サーバにログインしているユーザの一覧を表示しますし、「date
」とすれば、現在の日付が表示されるのです。そして、この自由度が潜在的なセキュリティホールになるのは、UNIX をやっている人なら分かると思います。もちろん、自分で作ったプログラムを呼び出すこともできますし、悪用しようと思えばかなりのことも出来ます。ここら辺も、ISP が SSI を使用するのを嫌う一つではないでしょうか。
ISP によっては、SSI は使えるけど、exec
コマンドだけは使用禁止にしてあるかもしれません。Apache では、exec
コマンドだけを使用禁止にする設定が存在します。また、コマンドによっては、実行権限を確認する必要があります。実際のところ、Apache の場合、このコマンドは「/bin/sh
」に渡されているようです。そして、nobody
ユーザの権限で動いています。もっとも、nobody
で動くかどうかは、設定によって変わるので、調べてみるのもいいかもしれません。WWW サーバに telnet
して、「ps acux | grep httpd
」などとすれば、どのユーザで動いているかわかると思います。先頭に表示されるのがユーザ名で、最低一つは root
が表示されるでしょうが、それ以外は、nobody
か、それに変わる権限の低いユーザで動いていると思います。
もう一つ、似たようなので、CGI を起動する方法を紹介します。
<!--#exec cgi="cgi-bin/hello.cgi"-->
これは、CGI プログラムのファイルを指定して、それを実行します。CGI についての詳細は他のページに譲りますが、実際の CGI としての動きと違う部分を説明しておきます。CGI プログラムは、普通最初にMIME ヘッダーを送信しますが、exec cgi
で起動された場合は、MIME ヘッダーが無効化されます。唯一の例外は「Location:
」ヘッダーで、これは、アンカー(リンク文字)に変換されて表示されます。ただし、この変換は、サーバによって違うようです。私のところの環境では、CGI プログラムが、Location ヘッダー以外に文字を出力しないときに限り、下のサンプルのように変換されます。CGI として書かれたファイルを、exec cmd
で起動すると、当然のことながら、ヘッダー文字列がhtml に挿入され画面に表示されます(普通のコマンドの実行結果と同じだから)。
今までの説明で、exec cmd
や exec cgi
をコマンドと言ってきましたが、これは正確ではありません。コマンドと呼ばれる部分は、exec
であり、cmd
や cgi
は exec
コマンドの引数です。