CGIプログラミングと再帰概念

情報システム概論 I 

                               システム情報工学研究科CS専攻、電子・情報工学系
                               新城 靖
                               <yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/compsys1-2006/2007-02-28
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/

■連絡事項

■復習

■目標

CGIプログラミングを通じて今までの内容を総合的に理解する。

■CGI

WWW サーバは、普通は、ファイルに保存された HTML データやイメージ・データを 読み込み、WWWブラウザに返する。 CGI (Common Gateway Interface) では、ファイルが読み込まれる代わりにプログラムが実行され、その実行結果 がブラウザに返される。

Gateway とは、WWW で使われている HTTP というプロトコルへの入り口という 意味。 プログラムの実行結果は、普通は、HTML にすることが多いが、普通のテキス トであることもイメージであることもある。

クライアント、WWWサーバ、CGIによるプロセス、ファイル

図? CGIの仕組み

「プロセス」とは、実行中のプログラム。

CGI の利用例

◆CGIのファイル名

CGI になるファイル名のパタン

設定によっては、これ以外のものも可能である。

◆CGIプログラムを記述するための言語

スクリプト言語が多く使われる。 C言語やJava言語を使うこともできる。

◆カウンタの例

ある URL にアクセスするたびに、1増えた数が表示される。 複数のクライアントを考えると、2以上増えた数が表示されることもある。

http://www.coins.tsukuba.ac.jp/~yas/coins/compsys1-2006/2007-02-28/counter.cgi

   1:	#!/usr/bin/ruby
   2:	
   3:	Datafile="/home1/prof/yas/coins/compsys1-2006/cgi-data/counter.data"
   4:	
   5:	def main()
   6:	        begin
   7:	            f=File.open(Datafile,"r+",0666)
   8:	        rescue StandardError => e
   9:	            show_error("touch datafile")
  10:	        end
  11:	        f.flock(File::LOCK_EX)
  12:	        c_str = f.read()
  13:	        if( c_str == "" )
  14:	            c_str = "0"
  15:	        end
  16:	        c = Integer(c_str)
  17:	        c = c+1 
  18:	        f.rewind()
  19:	        c_str = c.to_s()
  20:	        f.write( c_str )
  21:	        f.truncate(f.pos)
  22:	        f.flock(File::LOCK_UN)
  23:	        f.close()
  24:	        show_counter_value( c )
  25:	        exit( 0 )
  26:	end
  27:	
  28:	def show_counter_value( c )
  29:	        msg = <<-EOF
  30:	Content-Type: text/plain
  31:	
  32:	#{c}
  33:	EOF
  34:	        print( msg )
  35:	end
  36:	
  37:	def show_error( e )
  38:	        msg = <<-EOF
  39:	Content-Type: text/plain; charset=EUC-JP
  40:	
  41:	エラーです。ごめんなさい。
  42:	EOF
  43:	        print( msg )
  44:	        exit( 1 )
  45:	end
  46:	
  47:	main()
WWW ブラウザを使って Apache 経由で実行させ、その結果を表示する代わりに シェルから実行し、結果を端末の画面に表示させる方法もある。
% cd ~yas/public_html/coins/compsys1-2006/2007-02-28  [←]
% ./counter.cgi [←]
Content-Type: text/plain

10
% ./counter.cgi [←]
Content-Type: text/plain

11
% []
CGI のプログラムは、画面(標準出力)に結果を表示する。一行目は、 Content-Type: が多い。HTML を出力するなら、Content-Type: text/html と する。 空行以降に、ブラウザの画面に表示されるべきデータを置く。 (空行以前は、HTTP のヘッダに関係している)。

WWW サーバ Apache は、1行目を解析(parse)して、クライアントに対して返 すべき HTTP のヘッダを作成する。それ以外のヘッダも生成して送る。

◆telnetクライアント

telnet コマンドを使って、HTTP のクライアント側の命令(GETまたはPOST)を キーボードから手で打ってみる。
% telnet www.coins.tsukuba.ac.jp 80 [←]
Trying 130.158.86.207...
Connected to orchid-nwd.coins.tsukuba.ac.jp.
Escape character is '^]'.
GET /~yas/coins/compsys1-2006/2007-02-28/counter.cgi HTTP/1.0[←]
[←]
HTTP/1.1 200 OK
Date: Tue, 27 Feb 2007 03:12:23 GMT
Server: Apache/2.0.55 (Unix) PHP/4.4.2
Connection: close
Content-Type: text/plain

12
Connection closed by foreign host.
% telnet www.coins.tsukuba.ac.jp 80 [←]
Trying 130.158.86.207...
Connected to orchid-nwd.coins.tsukuba.ac.jp.
Escape character is '^]'.
POST /~yas/coins/compsys1-2006/2007-02-28/counter.cgi HTTP/1.0[←]
[←]
HTTP/1.1 200 OK
Date: Tue, 27 Feb 2007 03:12:45 GMT
Server: Apache/2.0.55 (Unix) PHP/4.4.2
Connection: close
Content-Type: text/plain

13
Connection closed by foreign host.
% []

◆「#!」によるインタプリタの指定

シェルから実行可能なプログラムには、2種類ある。
実行型式(executable)
コンパイルしてリンクまですんだ機械語のプログラム。 メモリに読み込むと、CPU というハードウェアによるインタプリタにより 実行される。
スクリプト
インタプリタにより解釈実行されるプログラム。
いずれのプログラムも、ファイルに保存されている。実行可能(ls -l の表示 で x ビットが on)である必要がある。

Unix オペレーティング・システムのカーネルは、 ファイルに保存された実行型式のプログラムを、 ファイル(ハードディスク)からメモリにコピーして実行する機能がある。 ただし、先頭の2バイトが「#!」であった場合は、メモリに読み込むのは、 そのファイルではなく、「#!」以降に記述されたファイルを読み込み実行する。 「#!」には、普通、インタプリタを指定する。

インタプリタ(機械語)は、実行されると、引数として、 プログラム(テキスト)が含まれているファイルの名前を得る。 それをメモリに読み込んで、(機械語には変換せず)解釈・実行する。 ( 仮想計算機の機械語や木構造などの中間言語に変換することがある。 )

◆#!/bin/cat

cat コマンドも、インタプリタとして利用できる。
% ls -l run-cat-n  [←]
-rwxr-xr-x   1 yas  prof  20 Feb 27 12:14 run-cat-n
% cat run-cat-n  [←]
#!/bin/cat -n
hello
% ./run-cat-n  [←]
     1  #!/bin/cat -n
     2  hello
% cat -n ./run-cat-n  [←]
     1  #!/bin/cat -n
     2  hello
% []

◆Rubyのプログラムの読み方

オブジェクト指向のプログラムを読む。
    s = f.read()
C言語のような手続き型言語では、次のように書く
    s = read(f)

◆ファイルの操作

プログラムか見るとファイルには、次のような操作がある。 Ruby の場合、ファイルに対する read() や write() では、ASCIIコードで符 合化された文字列として扱っている。ASCII文字列ではなく、メモリ中の形式 (32ビットのバイナリ)で読み書きする方法もある。

上のプログラムでは、Integer() で、整数に変換している。

File::open() で、エラーが起きると、「例外」が発生し、制御がrescue に飛 ぶ。

■TCP/IPの実装場所

TCP/IP を実現しているプログラムは、オペレーティング・システムのカーネ ル内にあることが一般的である。

カーネルには、通信のためのハードウェア(ネットワーク・インタフェース)を 操作するためのデバイス・ドライバも含まれる。

ネットワーク通信を行うプログラムは、システムコールを通じてTCP/IP の機 能を利用する。

■セキュリティ

2つの技術

◆認証

情報の正当性や完全性を確保する技術
利用者認証
アクセスしている人物が本当にそ の人本人であるかを確認すること。ユーザ名とパスワードがよく使われる。
ディジタル署名
人間を確認するのではなく、送られてきたメッセージが送信者本人が出 したものかを確認する。
利用者認証が済むと、それで得られた利用者の情報を使ってアクセス制御を行う。

◆アクセス制御

アクセス制御(access control) とは、「主体」が、「オブジェクト」を「操作」する時、どんな操作なら正し いということを定義して、それがきちんと守られていることをということを保 証することである。

図? アクセス制御における主体、オブジェクト、および、操作

図? アクセス制御における主体、オブジェクト、および、操作

Unixにおけるアクセス制御とは

Unixでは、アクセス制御の主体は、プロセスである。 アクセス制御のオブジェクトは、ファイル、または、プロセスである。 操作には、次のようなものがある。

ファイルに対するアクセス制御

UNIXでは、ファイルの「内容」のアクセス制御を次の3段階で行う。
ユーザ
ファイルのUID(所有者)が、プロセスのUIDと同じ
グループ
ファイルのGIDが、プロセスのGIDのリストのどれかと同じ
その他
上の2つに当てはまらない時
これをつかって、モード属性の下位9ビットのうち、どの3ビットを使うかを 決める。そして、そのビットが1になっていれば、その操作が許される。

ファイルの「内容」のアクセス3段階であるが、ファイルの「属性」次の2段 階である。

ユーザ
ファイルのUID(所有者)が、プロセスのUIDと同じ
それ以外
ファイルのUID(所有者)が、プロセスのUIDと異なる
ユーザの権限では、ファイルの属性(モード、グループ、時刻)を変更する ことができる。それ以外の権 限では、属性を読み出すことはできるが、変更は一切できない。 つまり、ファイルの内容がアクセスできなくても、ls -l, stat(2) で 属性を調べることはでる。

プロセスに対するアクセス制御

プロセスのアクセス制御は、次の2段階で行なう。
同一ユーザ
操作対象のプロセスが、操作するプロセスのUIDと一致している。
それ以外
操作対象のプロセスが、操作するプロセスのUIDと一致していない。
プロセスの操作としては、シグナルを送ることができるかどうか (kill() システムコール) と、デバッガで デバッグすることができるとか(ptrace() システムコール)、トレースを調べることができるかなどが ある。それらの操作は、同一ユーザの場合 許され、そうではない場合は、許されない。

WWWページに対するアクセス制御

WWW ページのアクセス制御は、主体は、WWW ブラウザ(を使っている人)、 オブジェクトは、サーバ側にあり、URL で示されるもの(ファイル、ディレクトリ、CGI のプログラム)、 操作としては、GET、POST などがある。

アクセス制御の方針(ポリシー)は、サーバ側で記述される。 この時、次のような情報がよく使われる。

アクセス制御は、基本的には、WWWサーバの管理者の仕事である。 WWWサーバ (httpd) の設定ファイル ( /usr/local/etc/httpd/conf/httpd.conf, /var/www/conf/httpd.conf など ) に記述される。

個人のページについては、 .htaccess というファイルを作れば、個人で変更できるようになっている場合がある。

IPアドレスによるアクセス制御

IPアドレスにより筑波大学の学内にだけアクセス可能なページを作るための .htaccess の例。
order deny,allow
deny from all
allow from 130.158.0.0/16 133.51.0.0/16 192.50.17.0/24

パスワードが設定されたページのアクセス

例:パスワード・ファイル /home/lab/Denjo/yas/etc/passwd-doc1 に登録されているユーザだけが、 .htaccess があるディレクトリ以下にあるファイルをアクセスできる。

AuthType Basic
AuthName "Members Only"
AuthUserFile /home1/prof/yas/etc/passwd-doc1
require valid-user
このパスワード・ファイルは、htpasswd というプログラムで作成する。 coins では、LDAP サーバを参照する方法も使えるようにしている。

https://www.coins.tsukuba.ac.jp/ce/index.php?web%B4%C4%B6%AD

AuthType Basic を使うアクセス制御の方法では、パスワードがそのままネッ トワークを流れてしまうので、盗聴に弱い。 coins では、SSL による暗号通信を使うようにできている。

◆暗号

暗号とは、情報の意味が当事者以外にはわからないように情報を変 換することである。

図? 暗号の考え方

図? 暗号の考え方

平文(ひらぶん(clear text))
元の情報
暗号文(cipher text)
変換された情報
平文、暗号文といっても、文字だけでなく、画像や音声などコンピュータが扱 えるあらゆるデータが想定されている。

暗号化(encrypt)
平文を暗号文に変換すること。暗号化鍵が必要。
復号化(decrypt)
暗号文を平文にもどすこと。復号化鍵が必要。
鍵(key)
暗号化や複合化に必要な(短い)データ。
解読
当事者以外の第三者が、暗号文を元にもどすこと、あるいは、復号化鍵を得る こと。
暗号化や複合化の方法(アルゴリズム)は、何種類もある。

◆共通鍵暗号系と公開鍵暗号系

暗号の方法は、大きく2つに分類される

共通鍵暗号系(対称暗号系)
暗号化鍵と復号化鍵が同じ(または片方から片方が簡単に計算できる)。
公開鍵暗号系(非対称暗号系)
暗号化鍵から復号化鍵を容易に類推できない。

公開鍵暗号方式は、鍵管理の手間が低い。速度が遅いという問題がある。共通 鍵暗号と組み合わせて使う。乱数で生成した共通鍵暗号の鍵を公開鍵暗号方式 で配る。

利用例

くわしくは、3年生の「情報セキュリティ」、「分散システム」で。

■再帰概念(recurring concepts)

コンピュータのハードウェア、ソフトウェアの作りで繰り返し現れる考え方。 (再帰呼出し、再帰構造とは関係がない。)

◆3種類の情報処理

計算
CPU、機械語、プログラミング言語
通信
イーサネット、無線LAN、インターネット
記憶
メモリ、ハードディスク、仮想記憶、ファイル、データベース、 永続性
コピーが多い。

01で符合化できれば、あとは、なんとかなる。 (01で符合化できないものは、どうしようもない。)

キャッシング
記憶は損するが時間で得
圧縮
CPU時間は損だが記憶容量は得。通信で使うと時間も得することがある。

◆バインディング(名前づけ)

◆大規模な問題とどう向き合うか

木構造で考える 層構造(layered structure)

◆抽象化、仮想化

◆構造化、パタン、単純化

◆並行性

◆セキュリティ

アクセス制御

◆連想

◆効率

高速化(量の変化)すると使い方(質の変化)をもたらす。

情報システム流の考え方。とにかく速くする、大量のものを扱えるようにすれ ば、すれば質も自ずから変る。

相転移。


Last updated: 2007/02/27 12:46:53
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>