[ホーム] -> [SSI 実験室]

とりあえず、Hello World

とりあえず、前置き

プログラムで最初にやることといえば、当然 K & R の伝統に従って「Hello World」を表示させることです。これもその例に漏れず、SSI で「Hello World」を表示させてみようと思います。あ、とその前に断っておきますが、簡単な html 言語を、知っていることを前提として話をさせてもらいます。

Hello World の表示

実際のところ、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 を起動

もう一つ、似たようなので、CGI を起動する方法を紹介します。

<!--#exec cgi="cgi-bin/hello.cgi"-->

これは、CGI プログラムのファイルを指定して、それを実行します。CGI についての詳細は他のページに譲りますが、実際の CGI としての動きと違う部分を説明しておきます。CGI プログラムは、普通最初にMIME ヘッダーを送信しますが、exec cgi で起動された場合は、MIME ヘッダーが無効化されます。唯一の例外は「Location:」ヘッダーで、これは、アンカー(リンク文字)に変換されて表示されます。ただし、この変換は、サーバによって違うようです。私のところの環境では、CGI プログラムが、Location ヘッダー以外に文字を出力しないときに限り、下のサンプルのように変換されます。CGI として書かれたファイルを、exec cmd で起動すると、当然のことながら、ヘッダー文字列がhtml に挿入され画面に表示されます(普通のコマンドの実行結果と同じだから)。

補足説明

今までの説明で、exec cmdexec cgi をコマンドと言ってきましたが、これは正確ではありません。コマンドと呼ばれる部分は、exec であり、cmdcgiexec コマンドの引数です。

ホームへ