5-2. CGI の基本とその周辺 '99〜 (1) CGI の仕組み * はじめに ここではおおまかに CGI の仕組みについて述べるにとどめる。goo でも yahoo でも CGI と検索すると結構詳しい記事を見つけることができる。以下のサイトはざっと見て、参考 になるなと思ったところである。CGI の意味は狭義には、WWWサ−バの cgi-bin/ ディ レクトリ下でのみ起動できるプログラムと言える。広義にはWWWサ−バ側で稼働するプ ログラム全般といえる。プログラムはスクリプト言語、コンパイル言語を問わない。まあ そう単純なものでないのだが、とりあえずはそう思っても概ね間違いではないだろう。 http://www.jah.ne.jp/~mote/html_memo/index.html > HTML ぱわ−あっぷめも。 http://softpark.cplaza.or.jp/text/cgi/cgi01-1.html > BIGLOBE SoftPlaza, 連載 CGI 講座。 http://ash.or.jp/ash/tips-prog/html/prog-cgi.htm > CGI プログラミングについて詳しい。サンプルもあり。 身近な CGI は、ホ−ムペ−ジのカウンタ−の設置だろう。 小生が入っている "東海イン タ−ネット" では Shell サ−ビスといって、CGI と SSI が使えるようになっている。カ ウンタ−を付けるには というように記述 する。Count.cgi というプログラムに df=top と dd=Z という引き数を渡すと、実行結果 が Count.cgi という GIF デ−タになって返ってくる。 カウンタ−の数字は GIF デ−タ になっている。サ−ビスにはカウンタ−の他にも CGI メ−ル というのもある。 * cgi-bin の超基本 URL を指定して、ただプログラムを実行するだけである。下記では のようにアクセスする。 |今何時 | ../cgi-bin/date1 ブラウザで "今何時" をクリックすると、サ ------------------------------------ −バで /bin/date コマンドが起動し、 その |#!/bin/sh 結果をブラウザにプレ−ン・テキストで返す。 |DATE=/bin/date |echo Content-type: text/plain Wed Dec 1 15:08:24 GMT+9:00 1999 |echo |if [ -x $DATE ]; then | $DATE |else | echo Cannot find date command. |fi ../cgi-bin/date2 test.html の /cgi-bin/date1 の所を date2 ------------------------------------ にかえてやってみよう。"今何時"をクリック |#!/bin/sh すると結果なんたらとブラウザに表示される。 |echo Content-type: text/html cat << EOM のとこは、EOM または EOF を入 |echo れること。 |cat << EOM | |

結果

|sayuri
|yasuko | |EOM * CGI の POST と GET cgi-bin プログラムに引き数を渡すには、FORM の GET と POST メソッドを使う。GET は 環境変数 QUERY_STRING で引き数を渡す。たくさんの文字列はだめとか。 POST は環境変 数 CONTENT_LENGTH の長さ分を標準入力で渡す。こちらは長いのもOKとか。下記の例は NCSA http Ver.1.3 の cgi-src/ にあった post-query.c をコンパイルして cgi-bin/ に 置いた post-query を使ったものである。メソッド POST で渡す引き数の値を取り出して 表示するだけのプログラムである。 test.html -------------------------------------------------- |
|Text_1:

|Text_2:

|Submit:

|Reset : |

-------------------------------------------------- |http://192.10.10.1/cgi-bin/post-query |------------------------------------------------- | Query Results | You submitted the following name/value pairs: | ・text1 = katou | ・text2 = haruo test.html で
にしてみる。 画面の入力 フィ−ルドに文字列を入れて Submit ボタンを押すと、ブラウザでは /query?text1= ... と引き数が出てくる。これは逆に直接下記のように記述しても、同様実行されることにな る。この書式は URL encoding といって、1バイトのブランクは '+' で、 漢字などの2 バイトコ−ドは '%' に続けて16進コ−ド表記する決まりになっている。POST でも変数 はこの形式で渡る。cgi-bin プログラム側では、この文字列を解析して、変数を取り出さ なければならない。 CERN httpd にはC言語で書かれた cgiparse、cgiutils という汎用 的な解析ル−チンがある。Perl なら数行で書ける。PHP3 だと解析は不要で直に変数を参 照できる。 --------------------------------------------------------- |http://192.10.10.1/cgi-bin/query?text1=katou&text2=haruo |-------------------------------------------------------- | 上と同じ結果です * CGI 実行の様子をみる Apache 1.3.9 の cgi-bin/printenv で GET の様子をみてみる。 QUERY_STRING に引き数 が渡ってセットされていることがわかる。 printenv CGI プログラム。 htdocs ディレクトリ ------------------------------------- にコピ−してもデフォルトの設定では実 |#!/usr/local/bin/perl 行できないようになっている。このプロ |print "Content-type: text/html\n\n"; グラムは全ての環境変数を表示する。 |while (($key, $val) = each %ENV) { | print "$key = $val
\n"; |} ブラウザからのアクセスと結果の表示。 --------------------------------------------------------- |http://localhost/cgi-bin/printenv?v1=katou?v2=yasuko |-------------------------------------------------------- |SERVER_SOFTWARE=Apache/1.3.9(Unix) PHP/3.0.12-i18n-beta4 |GATEWAY_INTERFACE=CGI/1.1 |REQUEST_METHOD=GET 本当はもっと一杯、環境変数は出ている。 |QUERY_STRING=v1=katou?v2=yasuko * 環境変数を直接セットしての実験 [ POST の post-query ] NCSA httpd 環境変数を直接セットして、cgi-bin プログラムに変数を渡してみる。 post-query.c プ ログラムはちょっと修正をした。cgi-src にソ−スがあるので、それを修正しコンパイル する。post-query.c それに query.c もそうだが util.c とバインドするようになってい ることに注意されたい。ただ変数を取り出すだけのプログラムなのに大がかりだ。 % setenv REQUEST_METHOD POST % setenv CONTENT_LENGTH 17 入力する変数のバイト数。 % echo "para1=v1¶2=v2" | post-query 標準入力からパラメ−タを入れる。 Content-type: text/html < Apollo でのコンパイル&リンク >

Query Results

$ cc query [ GET の cgiparse ] CERN httpd % cd /usr/local/source/WWW/Daemon/sgi;ls ただ cgiparse とコマンドを打つとバ− Makefile cgiparse cgiutils ジョンが 1.1、CERN 1994 CGI/1.0 なん たらと出て、 -value の他に -keywords, test.cgi -form, -read, -int等のオプションもあ ------------------------------------------- ることが分かる。 |#/bin/sh |cgiparse=/usr/local/source/WWW/Daemon/sgi/cgiparse |kotae1='$cgiparse -value para1' |echo $kotae1 |kotae2='$cgiparse -value para2' |echo $kotae2 % setenv REQUEST_METHOD GET % setenv QUERY_STRING "para1=v1¶2=v2" % test.cgi v1 v2 * サ−バサイドスクリプト `2h/09/s 追記した WWWサ−バサイドスクリプトともいう。 最も一般的なのは CGI である。どのWWWサ −バもサポ−トするアプリケ−ション・インタ−フェ−スである。CGI プログラミングに はC言語でも Perl でも Shell でもなんでもよい。欠点は HTTPアクセスのセッションを キ−プできないことである。その後出てきたWWW用 API は、 たいがいセッションをキ −プできるようになっている。cookie を使ったり、アクセス元 URL にIDをつけたりし て、どこからのアクセスでどういう状態か分かるようにしている。通常 HTTP アクセスは ペ−ジの中の画像デ−タなど1つずつが1セッションとして扱われる。Webブラウジン グの最中は、常にセッションを張ったり切ったりしている訳である。 WWWサ−バからDBにアクセスするには、それなりのプログラムを書かなければならな い。これを簡単に記述しようというのが ISAPI、NSAPI である。SQL の発行と結果を簡単 に記述できるらしい。WRB は Oracle WebServer の IIOP用 API で、単なるデ−タベ−ス 連携 API とは異なる。API はマルチスレッド対応のもある。これは複数の API アクセス をさばくための機構である。通常1個の APIアクセスに対し、1つのプロセスが対応する。 プロセスが増えるとメモリもそれだけ必要になり、コンピュ−タのリソ−スを食べていく。 マルチスレッドは1個のプロセスの中にサブプロセスを作り、メモリをある程度共用する。 このため効率よく処理を進めることができる。 ※ここの記事は下の方にもあった。 WWWの HTTP はセッションを維持できないといわれる。 HTTP は1つの HTML ファイル、 その中にある画像デ−タなどロ−ドする度にセッションを張り、すぐ切ってしまう。これ を繰り返して1つの画面を表示する。ここではセッション=コネクションになっていると 考えていい。これが HTTP がコネクションレスの通信であるといわれる理由にもなってい る。"UDP はコネクションレス型の意味" とはまた異なる。 蛇足だがWWWのデ−タ変更 に、このコネクションレスが便利だということを言っておこう。WWWサ−バを稼働して いる状態で、デ−タを消去したり追加したりできるのである。反面排他制御ができないわ けだが。WWWではできんでも問題ないから構わない。 * CERN の cgiparse と cgiutils % cgiparse cgiparse Version 1.1 CERN 1994 Program for CGI/1.0 scripts, to parse QUERY_STRING environment variable (method GET) or standard input (method POST). Can also be used to just read CONTENT_LENGTH characters from stdin. Usage: cgiparse -keywords cgiparse -form [-sep ] -prefix cgiparse -value [-sep ] cgiparse -read cgiparse -init Options: -sep xx with -form Specify multi-value separator, default ", " with -value The same, but default is newline -prefix xx only with -form Set the shell variable suffix, default is FORM_ -count with -keywords Output the number of keywords with -form Give the number of unique form fields (multiple values counted as one) with -value xx Give the number of multiple values of field xx - e.g. -2 with -keyword Give n'th keyword with -form Give all values of n'th field with -value xx Give n'th of multi-values of field xx -quiet Suppress error messages (non-zero exit status still indicates error) Options have one-character equivalents: -k -f -v -r -i -s -p -c -q Exit statuses: 0 Success 1 Illegal arguments 2 Environment not set correctly 3 Failed to get the information (no such field, QUERY_STRING contains keywords when form field values requested, etc) % cgiutils cgiutils version 1.0 (c) CERN 1994 Utility program for generating HTTP response from CGI scripts Usage: cgiutils -version cgiutils [-verbose] [-nodate] [-noel] -opt param -opt param ... -verbose Verbose output -nodate Don't produce Date: header -noel Don't print empty line after headers -status nnn Give full HTTP response with nnn as status code -reason xxx Use xxx reason line instead of default for nnn status -ct xxx/yyy Content-Type: -ce xxx Content-Transfer-Encoding: -cl xxx Content-Language: -length nnn Content-Length: -uri xxx URI: -expires time Specify how long document will be up-to-date Time is specified as a combination of: n secs, n mins, n hours, n days, n weeks, n months, n years Or: now meaning immediate expiry If there is a header that can't be specified otherwise, use: -extra "xxx: yyy" (2) CGI の関連知識 * FORM コマンド一覧 一応こんなコマンドがあるよということで。初期の HTML バ−ジョンで既に使えたもので ある。新しいバ−ジョンでは、少しコマンドが増えているようである。でも基本はこんな ものである。通常の FORM はブラウザで何かユ−ザが入力したり、選択したりするための 画面である。INPUT TYPE=HIDDEN はちょっと変わっている。入力画面は出さずに、あらか じめ NAME="内緒" というように、記入しておいた文字列をWWWサ−バに送る。 使い道 はいろいろありそうである。 住所 << 一番簡単な記述の仕方。 名前 << 入力する場所の長さを指定する。 既婚 << デフォルト値も入れておく。 性別 << TYPE=TEXT はデフォルト。 FORM METHOD=GET ACTION (GET がデフォルト) =POST INPUT TYPE =TEXT SIZE, VALUE, NAME, MAXLENGTH (TEXT がデフォルト) =PASSWORD =CHECKBOX CHECKED =RADIO CHECKED =HIDDEN =SUBMIT =RESET SELECT NAME="name" MULTIPLE, OPTION( SELECTED ) TEXTAREA NAME="name" ROWS, COLS * 環境変数について 下記の test-cgi は NCSA httpd 1.3 に入っていたもの。WWWサ−バを稼働させてブラ ウザからアクセスすると結果が表示される。 Apache には cgi-bin/printenv というのが あり、全部の環境変数を表示する。環境変数にはWWWサ−バが持っているのと、アクセ スしたブラウザが持っているのがある。ブラウザが Cookie 変数を保持していれば下記に echo $HTTP_COOKIE と追加すれば出てくる。しかし環境変数というのは、何となくよく分 からんバイ。WWWサ−バがブラウザの環境変数を見て動作をかえる。 Cookie なんかは そうなんだが、どうやってブラウザの環境変数をサ−バに送るのか。 HTTP のプロトコル で送っているはずなのだが。一度 Sniffer ででも監視してみるか。 ../cgi-bin/test-cgi ---------------------------------- << 概ねこんな環境変数がある >> |#!/bin/sh |echo Content-type: text/plain |echo |echo CGI/1.0 test script report: |echo |echo argc is $#. argv is "$*". |echo |echo SERVER_SOFTWARE = $SERVER_SOFTWARE |echo SERVER_NAME = $SERVER_NAME |echo GATEWAY_INTERFACE = $GATEWAY_INTERFACE |echo SERVER_PROTOCOL = $SERVER_PROTOCOL |echo SERVER_PORT = $SERVER_PORT |echo REQUEST_METHOD = $REQUEST_METHOD |echo HTTP_ACCEPT = $HTTP_ACCEPT |echo PATH_INFO = $PATH_INFO |echo PATH_TRANSLATED = $PATH_TRANSLATED |echo SCRIPT_NAME = $SCRIPT_NAME |echo QUERY_STRING = $QUERY_STRING |echo REMOTE_HOST = $REMOTE_HOST ブラウザ稼働のホスト名。 |echo REMOTE_ADDR = $REMOTE_ADDR ブラウザ稼働のIPアドレス。 |echo REMOTE_USER = $REMOTE_USER 認証で入力したID。 |echo AUTH_TYPE = $AUTH_TYPE |echo CONTENT_TYPE = $CONTENT_TYPE |echo CONTENT_LENGTH = $CONTENT_LENGTH * cgi-bin ディレクトリの危険性 以下は NCSA httpd 1.3 をインスト−ルした cgi-bin ディレクトリの状態である。 他に も cgi-src にユ−ティリティソフトが入り、 make をかけると cgi-bin に実行モジュ− ルができるようになっている。 意識しないうちに勝手に CGI プログラムが入るようにな っていたわけだ。このWWWサ−バを外部用として稼働させると、外からアクセスできて しまう。cgi-bin を使ってないのなら、 すぐに cgi-bin 内のファイルは消した方が身の ためである。 http://www.nix.co.jj/cgi-bin/finger このディレクトリ内の幾つかのプログラムには、セキュリティホ−ルがありクラッカ−の 餌食にされた。NCSA の新しいバ−ジョンでは、 cgi-bin ディレクトリの危険なプログラ ムはインスト−ルされなくなっている。 Apache 1.3.9 では /usr/local/apache/cgi-bin には、printenv と test-cgi の2つしか入らなかった。 これらは環境変数を出すだけの 無難なものである。 % ls cgi-bin archie date fortune test-cgi uptime calendar finger nph-test-cgi test-cgi.tcl wais.pl % ls cgi-src Makefile change-passwd.c imagemap.c jj.c phf.c post-query.c query.c util.c * CGI 実行の危険性 % /usr/local/apache/bin << root ロッグインして Apache を起動する。 % apachectl start % ps -ef UID PID PPID C STIME TTY TIME COMD root 0 0 0 12月 9日 ? 0:01 sched katou 25433 25429 0 13:48:17 ? 0:00 /usr/local/apache/bin/httpd ここでブラウザから http://192.10.10.1/cgi-bin/date1 とアクセスする。そして素早く プロセスの状態を見てみる。httpd.conf の User は katou にしてある。 Apache を起動 する際は root で実行するが、プロセスの UserID は katou になる。そして CGI プログ ラムが呼び出されると、同じ katou の UserID で稼働することになる。 下記の通り、別 プロセスとして /cgi-bin/date1 が走っているのが見える。 date1 の中には sleep コマ ンドを入れて、それもどうなっているか見てみた。sleep はプロセスの状態を確認するに は都合がいい。もし sleep でなく rm * だったら。 katou の権限で消去できるファイル は全部消えてしまうぞ。cgi-bin の危険性はここである。 % ps -ef katou 25812 25430 0 14:04:17 ? 0:00 /bin/sh /usr/local/apache/cgi-bin/date1 katou 25813 25812 0 14:04:17 ? 0:00 /sbin/sleep 10 /usr/local/apache/cgi-bin/date1 ------------------------------- |#!/bin/sh |echo Content-type: text/plain |echo << この echo はいる。ないと表示が出ない。 |echo "katou" |/sbin/sleep 10 * Perl について 小生はほとんどこれまで Perl は使ったことはないが、案外簡単に使えそうである。イン タ−プリタ言語で、連想配列が使えるなどかなり柔軟な感じがする。プロバイダなんかち ょっとした監視を、これでパッパと書いて使っているようだ。CGI プログラムも Perl を 使えば便利といえば便利だが、外部用WWWサ−バで Perl を実行できるようにするには、 いかがなものか。危険性が大きいように思うが、だいじょうぶなんだろうか。 Perl( Practical Extraction and Report Language )と一口にいうが、種類は幾つもある ようだ。 Apache に組込んで一体として稼働させる mod_perl というのは雑誌などでよく 目にする。それに便利な関数としてのモジュ−ルも、 Perl をインスト−ルするといろい ろ入っている。CPAN( Comprehensive Perl Archive Network )という Perl の総合ア−カ イブサイトもある。http://www.perl.com/CPAN/ ここを見れば、何でもありかな。 [ Perl の簡単なスクリプト ] % cat ttt #!/usr/local/bin/perl << Perl のありかを示すのが決まり。 $ndate=localtime; << この localtime は Perl のコマンドである。 print "date = $ndate\n"; << 変数は何でも $xxx と表わす。print で表示。 % chmod +x ttt % ttt date = Thu Sep 30 13:10:14 1999 * Apollo に NCSA httpd を入れていた様子 `2h/09/E これで Apollo コンピュ−タで httpd を動かしてWWWサ−バの動作確認をした。 コン パイルは "10-7.フリ−ソフトのインスト−ル,(5)Apollo でコンパイルしてみる" を参照。 $ /usr/local/bin/httpd -f /usr/local/source/httpd_1.3/conf/httpd.conf $ wd /usr/local/source/httpd_1.3 $ ld README cgi-bin/ cgi-src/ conf/ htdoc/ htdocs/ << htdocs はテストで作った。 icons/ installation.txt intro-to-server.txt logs/ src/ support/ tutorials.txt upgrades.txt usage.txt intro-to-server.txt ----------------------------------------------------------- |NCSA httpd | |NCSA httpd is a HTTP/1.0 compatible server for making hypertext and other |documents available to Web browsers. Please read this copyright notice. | |This code is in the public domain. Specifically, we give to the public domain |all rights for future licensing of the source code, all resale rights, and all |publishing rights. | |We ask, but do not require, that the following message be included in all | derived works: | |Portions developed at the National Center for Supercomputing Applications at |the University of Illinois at Urbana-Champaign. | |The current version is 1.3. If you are using an earlier version, the upgrade |notes will be helpful. We also have an FAQ on NCSA httpd. | | |Why NCSA httpd? | |Here is a list of the server's features. Follow the links to read about them |and see demonstrations of their use. | | Low Impact | | Designed to be a small, fast server. | | Has a low impact on system resources, allowing it to serve documents | to a large number of users simultaneously with little slowdown. With | the amount of traffic www.ncsa.uiuc.edu gets, this was | required. | | Runs standalone, for faster performance, or under inetd. | | Compatibility | | NCSA httpd speaks both the HTTP/1.0 and HTTP/0.9 protocols, and will | serve documents to World Wide Web browsers speaking either dialect. In | addition, NCSA httpd allows easy serving of multimedia documents through | both protocols. | | $ ld conf access.conf access.conf-dist httpd.conf httpd.conf-dist mime.types srm.conf srm.conf-dist $ ld htdoc Copyright.html FAQ.html Overview.html PEMPGP.html Upgrade.html back.gif cgi/ current-release footnote.html fwd.gif icon.gif index.html.katou info/ postscript-docs security/ setup/ tutorials/ $ ld htdoc/cgi 10to11.html back.gif cl.html env.html examples.html forms.html from-htbin.html in.html index.html interface.html intro.html out.html overview.html primer.html prism-small.gif security.html test-cgi.txt $ ld cgi-src Makefile change-passwd.c imagemap.c jj.c phf.c post-query.c query.c util.c $ ld cgi-bin archie cern/ date date.cgi date2 finger imagemap jj nph-test-cgi p1.c p2.c phf post-query post2 post2.c pq pq.c query test-cgi test-cgi.tcl uu.c wais.pl cgi-bin 内の date と date.cgi は同じ内容だった。 ------------------------------------------------- |#!/bin/sh |DATE=/bin/date |#DATE=/com/date |echo Content-type: text/plain |echo |if [ -x $DATE ]; then | $DATE |else | echo Cannot find date command on this system. |fi (3) CGI とその仲間たち * CGI( Common Gateway Interface )とは何か? CGI というのはどうも幾つかの意味で使われているようである。ん−、整理しようと思っ て考えているのだが混乱しているバイ。 ともかく CGI のそもそもの機能は cgi-bin/ デ ィレクトリ下に、コンパイルした実行モジュ−ルなり、Perl や Shell のスクリプトを置 いておけば、実行できるよ。 実行した結果は HTML なり Plain ファイルを吐き出すよう にして、ブラウザにそれを返すよというものだ。CGI プログラムの起動は、 HTML コンテ ンツの FORM の Submit 指定で概ね行う。プログラムに引き数を渡すのは、FORM の POST か GET というメソッドにより、環境変数と標準入力でもって渡すということ。 ここまで のことならそう複雑ではない。下の c の意味も説明しておこう。NCSA httpd の cgi-bin には、archie や wais といったのがある。これらは HTTP とはプロトコルが違う。 ゲ− トウェイのインタ−フェ−スとして意味なのである。 a. WWWサ−バ側で動く、基本的には別なプログラムそのもの。 b. ブラウザからサ−バ側で動くプログラムに変数を渡すやり方。 c. プロトコルの違いを吸収するゲ−トウェイとして意味。 CGI のプログラムは cgi-bin/ 下におくことが基本だが、WWWサ−バの設定により他の ディレクトリでも xxx.cgi 等と、拡張子の区別で CGI プログラムとして働かせることも できる。cgi-bin/ のは拡張子は関係なくプログラムとして扱われる。 さて、CGI プログ ラムはWWWサ−バとは別なプロセスである。このためたくさんアクセスが来ると、同じ プログラムがプロセスとして複数起動してしまう。この負荷を軽減するため、マルチスレ ッド対応にするとか、CGI の機構をWWWに組み入れてしまうとか考えられてきたわけだ。 組み入れならWWWサ−バのプロセス内で処理できる。マルチスレッドは1個のプロセス の中にサブプロセスを作り、メモリをある程度共用することで負荷を減らす。似たような のにマルチタスクというのがある。これはOSレベルの話であり、幾つものプロセスを同 時に稼働させる処理をいう。 さらに HTML をもっと賢くしようというのもある。 if then else などの制御をできるよ うにしよう。デ−タベ−スへのアクセス関数も用意しようとなってきたわけである。デ− タベ−スにアクセスするには、それなりの SQL プログラムを書かなければならない。 こ れを簡単に記述しようというものである。また HTTP の欠点であるセッションをキ−プで きないこと。セッション管理するためには、Cookie を使ったり、アクセス元 URL にID を付けたりするプログラムを自分で書かなければならない。これは結構めんどくさそうで ある。そのための関数も用意しようか−という話になる。つまり HTML の拡張言語という べきもので、SSS( Server Side Script )と呼ばるものになる。 ともかく、ここまでなる と単に CGI と一口ではいえない。総称してWWWサ−バ用APIと呼ぶことにしよう。 WWW用API| 開発元など | 備考 -----------|----------------|--------------------------------------- CGI | フリ−ソフト | WWWサ−バ標準搭載。 FastCGI | Open Market 社 | Multi Thred 対応。フリ−ソフトみたい。 ISAPI | Microsoft 社 | DB連携とセッション管理はできる。 NSAPI | Netscape 社 | 〃 Multi Thred 対応。 WRB | Oracle 社 | 〃 Oracle WebServer の IIOP 用 API。 PHP3 | フリ−ソフト | 〃 実質的にはこれを使えばOK。 ISAPI : Internet Inforamtion Server API、Microsoft 社。 NSAPI : Netscape Enterprise Server API、Netscape Communications 社。 * サ−バ側で処理する形態 CGI( Common Gateway Interface ) > 単独のプログラムの呼び出し。通常はWWWサ−バの cgi-bin/ ディレクトリにプログ ラムをおく。クライアントに返すのは HTML 書式などのファイル。言語はなんでもいい。 Perl や Shell などのスクリプト言語でも、C言語でもいい。 SSS( Server Side Script ) > HTML 埋め込みの Perl や PHP3。HTML の記述に混ぜて書いてもいいし、 単独で書いて もいい。たとえば PHP3 のコマンド・モ−ドから HTML のヘッダ−などを書き出してい く。ファイルは拡張子で判断される。PHP3 なら xxx.php3 とあれば、PHP3 スクリプト が混ざっているということで、サ−バ側で処理されて HTML のスクリプトだけにしたの をクライアントへ送る。 SSI( Server Side Include ) > 拡張子 xxx.shtml でただの HTML ファイルと区別する。 xxx.shtml ファイルの中で別 の HTML ファイルを読み込んだりする。クライアントにはただの HTML ファイルを送る。 プログラムを実行させて結果を埋め込んだりもできる。かなり危険な機能である。 他にもいろいろ > Netscape Enterprise Server では JavaScript、Java Applet もサ−バ側で実行できる とある。これらはブラウザ側で実行するのが普通だが、用語が定まっていないのか。そ れに、CORBA の IIOP と関係する Web Application Interface( WAI ) というのも使え るそうな。Microsoft の IIS では ASP( Active Server Pages )というのが使える。稼 働は Windows NT のみ。Microsoft にはまだ他もあるようだが。 * サ−バ側プログラムの起動形態 プログラムをそのたびに起動するもの。 > ただの CGI。リクエスト分の CGI プロセスが立ち上がってしまう。 負荷が大きいと言 われるが、普通の会社のWWWサ−バでは問題にするまでもない。 プログラムがWWWサ−バと一体になっているもの。 > Apache に Perl(mod_perl) や PHP3 を組み込んだもの。 ランタイムライブラリをダイ ナミックロ−ディングするか、コンパイルして1つの実行モジュ−ルにしてしまうかで ある。ともかく CGI などのプロセスは稼働したような状態になる。 プログラムが複数起動する形態 > マルチスレッド。まあこんなこといいか−。NSAPI なんかのマニュアルを見ると、スレ ッドの数を幾つにするかとか載っている。Apache でも FastCGI というのでマルチスレ ッド対応にできるらしい。Apache 1.3.x には入ってない。前は入っていた?。 * おまけ:ブラウザ側で実行されるもの WWWブラウザが解釈して実行してくれる。先ずは JavaScript、 Microsoft は呼び名が 違うが。これはただの HTML ではできない if then else 何かの制御ができる。変数も覚 えることができるので、インタラクティブな画面ができる。小生の関係したプロジェクト で何と 500 Kbyes もの JavaScript プログラムをダウンロ−ドさせるのもあった。 こり ゃひどい。それと Java アプレット。下の例では TEST.class というのをサ−バからダウ ンロ−ドしてきて、ブラウザの中で実行する。 NE でも IE でも Java の実行環境がビル ト・インされているのだ。 xxx.html xxx.html ------------------------------- --------------------------- | | | | | (4) CGI 各機能の説明 * SSI( Server Side Include ) NCSA または Apache で使える機能だが、非常に危険である。 どうしてもという以外は使 わないようにした方がいい。これらのWWWサ−バで、xxx.shtml という拡張子のファイ ルをブラウザが要求した場合、アクセスしただけでプログラムを実行したり、指定ファイ ルを挿入したりするというものである。 下記では exec というのと include というのを 示しているが、他にも config, echo, fsize などのコマンドがある。NCSA、Apache のデ フォルトでは、xxx.shtml という拡張子は認識しないようになっている。まあ、こんな機 能もあるよということで。小生は最初なんかいなと思っていたが、危ない機能なので知っ ておく必要はあると思う。WWWサ−バではこのように、拡張子によって動作がいろいろ する。xxx.phtml は PHP3 の前バ−ジョンでまでの拡張子だったし、 xxx.pl は Perl だ ったり。十分気を付ける必要がある。

|

SSI test

|

| |

|yasuko | ----------------------------------- |http://www.nix.co.jj/test.shtml ブラウザで test.shtml にアクセスした結果。 |---------------------------------- |Fri Dec 3 12:17:39 JST 1999 |katou |SSI test |yasuko /usr/local/apache/conf/httpd.conf [ Apache 1.3.9 での制御ファイルの設定 ] ------------------------------------- | |Options All Options Indexes FollowSymLinks だったの | | を All にする。これで xxx.shtml を処理す |AddType text/html .shtml る。ん!、何かおかしなのも許可してないか。 |AddHandler server-parsed .shtml AddXX ここの2ヵ所もコメントを外すこと。 * キ−プアライブについて 一度ちゃんと確認してみるか。どうもセッションとコネクションが頭の中でごっちゃにな っている。WWWサ−バは Apache 1.3.9 で、とりあえず 8070 ポ−トで稼働させてみる。 キ−プアライブ機能を働かせるには、以下のように設定する。もっともデフォルトになっ ているが。働かせない場合は3ヵ所全部コメントにする。 これで隣のマシンの Netscape からアクセスして、WWWのマシンで tcpdump でパケットの状態を見るのだ。 WWWサ −バは NCSA httpd でもいい。 NCSA 初期のにはキ−プアライブ機能はなかったようであ る。制御ファイルは NCSA の場合、3つに別れているが Apache と設定変数は全く同じで ある。Apache は NCSA 1.3 をベ−スに開発が進められたから。 tcpdump の出力を見るポイントは S と F。 TCP/IP のコネクションの始まりは TCP フラ ッグの S(SYN)、終わりが F(FIN) である。S から F の間が1回のコネクションというこ とである。KeepAlive on にしていると、ブラウザから続いてアクセスしている間は F は 出てこない。そしてしばらくアクセスしないと、 ぽろっと F が出てくる。アクセスしな くなって KeepAliveTimeout 15 での15秒が過ぎると、 コネクションが切られるわけで ある。KeepAlive off にするとアクセス毎に S と F が出てくる。でも1つの HTML ファ イルのアクセスで、その中に GIF デ−タなんかがあっても、これで F が出るわけでない ようである。最低 HTML のペ−ジ単位でのコネクションになっているようだった。 /usr/local/apache/conf/httpd.conf [ Apache 1.3.9 での制御ファイルの設定 ] ---------------------------------- |KeepAlive on しないばあいは off とする。 |MaxKeepAliveRequests 100 0 にすると制限なしになる。 |KeepAliveTimeout 15 キ−プする時間、単位は秒。 % tcpdump tcp port 8070 15:36:28.545667 pc1.1523 > www.8070: S 18856224:18856224(0) win 8192 .. (DF) 15:36:28.545994 www.8070 > pc1.1523: S 1489088000:1489088000(0) ack .. 15:36:28.546122 www.8070 > pc1.1523: S 1489088000:1489088000(0) ack .. | 15:36:28.564196 www.8070 > pc1.1523: F 165:165(0) ack 394 win 61320 15:36:28.564333 www.8070 > pc1.1523: F 165:165(0) ack 394 win 61320 15:36:28.564598 pc1.1523 > www.8070: . ack 166 win 8596 (DF) 15:36:28.566111 pc1.1523 > www.8070: F 394:394(0) ack 166 win 8596 (DF) * Cookie の働き Windows パソコンの Netscape Navigator 4.5 でチェックしてみる。 Cookie を受け付け るようにするには、Netscape の [編集]→[設定]→[詳細] で行う。 実験のため分かりや すくするため Cookie がきたら、受け付けるかどうかの画面を毎回出すようにもしておく。 Cookie の実態はコンテンツのヘッダ−部の Set-Cookie: という記述である。WWWサ− バにアクセスして、返ってきた HTML などのヘッダ−部に、Set-Cookie: という記述があ れば、ブラウザはその情報を保存しようとする。情報はファイル保存と Netscape を稼働 している間だけ有効とがある。ブラウザで Cookie を受け付けないように設定おくと、ブ ラウザは Cookie 情報を無視するだけである。 Cookie 情報は、Netscape の場合 cookies.txt というファイルである。Netscape の個人 環境のディレクトリに作られる。最初はこのファイルはないし、 Cookie を受け付けない と設定するとその場でファイルは消去される。 以下はパソコンのユ−ザが ikken の場合 である。安全そうなところで www.fresheye.com にアクセスしてみる。できた Cookie 情 報である。次に Apache + PHP3 を 192.10.10.1:8080 で稼働させ、Cookie を作ってみた。 ppp.php3 は cookies.txt に情報を書き込んだ。cgi-bin/qqq の方はなぜか cookies.txt には書き込めなかった。/cgi-bin/rrr は、 WWWサ−バにアクセスした際のブラウザが 持っている Cookie 情報を表示する。 C:\Program Files\Netscape\Users\ikken\cookies.txt ------------------------------------------------------------------- |# Netscape HTTP Cookie File |# http://www.netscape.com/newsref/std/cookie_spec.html |# This is a generated file! Do not edit. もしこれがパスワ−ド | ↓ だったら? |www.fresheye.com FALSE / FALSE 2145800893 NGUserID 012sadx-Kxdesf |192.10.10.1:8080 FALSE FALSE 945760175 KATOU ikken ../htdocs/ppp.php3 cgi-bin におくと PHP3 ファイルとして ---------------------------------------- 認識してくれない。 ppp.php3 はとりあ | ↑ | 現在時刻に1時間足した時刻まで有効 |test | ../cgi-bin/qqq ---------------------------------------- HTML や プレ−ンテキストのファイルの |#!/bin/sh ヘッダ−部に Cookie 情報をセットする。 |echo Content-type: text/html |echo Set-Cookie: KATOU_ID=123; expires=Fri,24-Dec-99 12:00:00 GMT |echo ↑ ↑ ↑ |echo "" 識別名 その番号等なんでも 有効期限 |echo "katou" |echo "" ../cgi-bin/rrr Cookie 情報を見てみる。ppp.php3 のと ------------------------------- qqq の2つある。qqq はメモリ内だけ。 |#!/bin/sh ------------------------------------ |echo Content-type: text/plain |http://192.10.10.1:8080/cgi-bin/rrr |echo |----------------------------------- |echo RRR : $HTTP_COOKIE |RRR : KATOU_ID=123; KATOU=ikken [ お買い物かご ] インタ−ネット・ショッピングのサイトによくあるお買い物かごの機能は、このCookieを 用いている。商品を見ながら、買い物かごにこれ2個とか入れていって、最後に買います とクリックを押すと全部の注文が行くという仕組みだ。 Cookie はWWWサイトにアクセ スしているブラウザのマシンに、情報を記録する仕組みそのものだから、買い物かごにす るにはもってこいである。ブラウザでずっとそのサイトにアクセスする。見かけ一連の処 理のような気がするが、内部的には細切れの単独のアクセスが何回も発生しているに過ぎ ない。1画面見たら、それで telnet 開始して終了、そしてまた telnet という感じにな っているのだ。もう少し知りたければ「日経バイト」`02/08,09,10、 "インタ−ネット新 技術体系" に Cookie とショッピング・カ−トを作るという記事がある。フリ−ソフトも http://www.rescue.ne.jp/ に "簡易ショッピングバスケットシステム" というのがある。 WWWの HTTP はセッションをキ−プできないとか管理できないとか言われる。できない ものだから、このような仕組みを取るのである。お買い物かごは、単にWWWクライアン トに情報を書き込んでいるだけのことである。セッションをキ−プする機能でも何でもな い。実際WWWサ−バ側で、個々のユ−ザの買い物情報を管理するのは、プログラミング 的にかなり難しい話になる。クライアントに何らかの識別子を付け、ある時間プロセスを 稼働させておくことになるだろう。 しかし、IPアドレス変換や Proxy 経由でアクセが 来るとその組織の代表IPアドレスということになる。クライアントを区別するのはなか なか難しい。それよりも、WWWサ−バ側でIDをクライアントに付ける方が簡単である。 これにより買い物かごだけでなく、IDを元にユ−ザの好みの画面を返したりすることも できるようになる、CRM( Customer Relationship Management ) と呼ばれている。 (5) Apache の suEXEC と SetUID * Apache の suEXEC 機能とは Apache 1.2 から実装された機能で、一般ユ−ザの CGI を実行する前に、ユ−ザ権限を変 更する。su コマンドで root になるというイメ−ジがあるが違う。 Apache をもし root で稼働していたら、その cgi プログラムも root 権限で実行できてしまう。 それは危険 ということで、 suEXEC という機能で他の無難なユ−ザ権限で実行するようにするという ことらしい。ここでは CGI に関する Apache の制御ファイルの変数についても、 まとめ ようかと思ったがめんどくさくなった。また気が向いたら調べてみよう。 suEXEC につい ては、"SunWorld Online" のサイト http://www.idg.co.jp/swonline/top/index.html に "CGI スクリプトからセキュリティ・ホールを締め出す" という記事を見つけた。 suEXEC というのを知ったは、メ−リングリストの fml というソフトを設定していて、 この機能 を使っていたからである。それまで知らんかった。 * Solaris 2.6 での Apache # cd /usr/local/source/apache_1.3.9 # ./configure --enable-suexec --suexec-caller=nobody # cd /usr/local/apche/bin # ./apachectl start /usr/local/apache/conf/httpd.conf 関係するところのみ記載する --------------------------------------- |ServerType standalone |ServerRoot "/usr/local/apache" |Port 80 |User nobody --suexec-caller=nobody に対応する。 |Group nobody |ServerAdmin katou@nix.co.jj |ServerName hostB # hostname コマンドで出るの。 |DocumentRoot "/usr/local/apache/htdocs" | | | | Options Indexes FollowSymLinks | AllowOverride None | Order allow,deny | Allow from all | | | |UserDir public_html | 一般ユ−ザのディレクトリ。 | AllowOverride FileInfo AuthConfig Limit ↓これ追加 | Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec ExecCGI | | | |HostnameLookups Off |ErrorLog /usr/local/apache/logs/error_log | | |ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/" | | AllowOverride None | Options None | Order allow,deny | Allow from all | | | |AddHandler cgi-script .cgi * SetUID したプログラムの実行 tomo でロッグインして、ディレクトリ /usr/people/katou に入る。katou ディレクトリ は drwxr-xr-x katou user となっていて、他人さんがファイルを作成する権利は与えて ないとする。それで tomo さんがファイルを作ろうとしたら以下のように拒否された。 tomo% touch DDD "DDD" を作成できません ― 許可を与えられていません /usr/people/katou/test.c ------------------------------------- |#include どのヘッダ−ファイルが必要かは、記述する |#include 関数の、例えば # man getpwnam とやれば出 |#include て来る。マン・マニュアルをインスト−ルし |void main() てあればだが。たいがいは入っているはず。 |{ | struct passwd *pw; | pw = getpwnam("tomo"); /etc/passwd ファイルを見て tomo というユ | if (pw==NULL) { −ザがあるかチェックする。 | printf("NG\n"); exit(0); | } |/* printf("OK: %d\n",pw->pw_uid); */ | if (setuid( pw->pw_uid) == 0 ) { ユ−ザ tomo に SetUID する。 | printf("SetUID OK\n"); | system("/sbin/touch Tomo"); ユ−ザ tomo の権限で、カレントのディレク | } トリにファイルを作ろうとしてみる。 | else printf("SetUID NG\n"); |} katou% gcc test.c -o test INDY IRIX 5.3 でコンパイル。 katou% ls -l test -rwxr-xr-x 1 katou user .. test katou% test 実行モジュ−ル test のオ−ナが、katou の SetUID NG ままだと SetUID コマンドは効かないようだ。 root% chown root test; chmod 4511 test katou% ls -l test ファイルのオ−ナを root にして SetUID す -r-s--x--x 1 root user .. test る。これでユ−ザ katouで実行しても、結局 ユ−ザtomoで実行していることになる。root katou% test で実行しても同じ結果が出る。 SetUID OK "Tomo" を作成できません ― 許可を与えられていません