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

情報システム概論 I 

                                       電子・情報工学系
                                       新城 靖
                                       <yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/dsys-2005/2006-02-27
あるいは、次のページから手繰っていくこともできます。
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://www2.coins.tsukuba.ac.jp/~yas/coins/compsys1-2005/2006-02-27/counter.cgi
   1:	#!/usr/local3/bin/ruby
   2:	
   3:	Datafile="/home/lab/Denjo/yas/coins/compsys1-2005/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
  40:	
  41:	エラーです。ごめんなさい。
  42:	EOF
  43:	        print( msg )
  44:	        exit( 1 )
  45:	end
  46:	
  47:	main()
WWW ブラウザを使って Apache 経由で実行させ、その結果を表示する変りに、 シェルから実行し、結果を端末の画面に表示させる方法もある。
% cd ~yas/public_html/coins/compsys1-2005/2006-02-27 [←]
% ./counter.cgi [←]
Content-Type: text/plain

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

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

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

◆telnetクライアント

telnet コマンドを使って、HTTP のクライアント側の命令(GETまたはPOST)を キーボードから手で打ってみる。
% telnet www2.coins.tsukuba.ac.jp 80 [←]
Trying 130.158.86.5...
Connected to www2.coins.tsukuba.ac.jp.
Escape character is '^]'.
GET /~yas/coins/compsys1-2005/2006-02-27/counter.cgi HTTP/1.0[←]
[←]
HTTP/1.1 200 OK
Date: Sun, 26 Feb 2006 13:38:59 GMT
Server: Apache/1.3.27 (Unix)  (Red-Hat/Linux) mod_ssl/2.8.12 OpenSSL/0.9.6 DAV/1.0.2 PHP/4.1.2 mod_perl/1.24_01 mod_throttle/3.1.2
Connection: close
Content-Type: text/plain

129
Connection closed by foreign host.
% telnet www2.coins.tsukuba.ac.jp 80 [←]
Trying 130.158.86.5...
Connected to www2.coins.tsukuba.ac.jp.
Escape character is '^]'.
POST /~yas/coins/compsys1-2005/2006-02-27/counter.cgi HTTP/1.0[←]
[←]
HTTP/1.1 200 OK
Date: Sun, 26 Feb 2006 13:39:32 GMT
Server: Apache/1.3.27 (Unix)  (Red-Hat/Linux) mod_ssl/2.8.12 OpenSSL/0.9.6 DAV/1.0.2 PHP/4.1.2 mod_perl/1.24_01 mod_throttle/3.1.2
Connection: close
Content-Type: text/plain

130
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      lab            20 Feb 26 22:52 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 /home/lab/Denjo/yas/etc/passwd-doc1
require valid-user
このパスワード・ファイルは、サーバ(www,www2)上で htpasswd というプログ ラムで作る。
% ls /home/lab/Denjo/yas/etc/passwd-doc1 [←]
ls: /home/lab/Denjo/yas/etc/passwd-doc1: No such file or directory
% htpasswd -c /home/lab/Denjo/yas/etc/passwd-doc1 user1 [←]
Adding password for user1.
New password:user1のパスワードを打ち込む[←]
Re-type new password:user1のパスワードを打ち込む[←]
% htpasswd /home/lab/Denjo/yas/etc/passwd-doc1 user2 [←]
Adding user user2
New password:user2のパスワードを打ち込む[←]
Re-type new password:user2のパスワードを打ち込む[←]
% cat /home/lab/Denjo/yas/etc/passwd-doc1  [←]
user1:1fjr1tHIgoG7U
user2:qXaeA9Zge7Yqc
% []
一番最初は、-c オプション付で実行する。passwd コマ ンドと同様に、打ち込んだパスワードは、画面には表示されず、また、確 認のために2回打つ必要がある。

htpasswd コマンドの結果、次のようなファイルが作られる。

user1:1fjr1tHIgoG7U
user2:qXaeA9Zge7Yqc
ユーザ名と暗号化されたパスワード(ハッシュ値)から構成される。 このファイルは、~/public_html 以外の場所に置くと GET で盗まれることはない。

このアクセス制御が有効なファイルをクライアントが GET したとする。

GET /dir1/file1.html HTTP/1.0[←]
[←]
すると、サーバから次のようなエラーが返される。
HTTP/1.1 401 Authorization Required
WWW-Authenticate: Basic realm="Members Only"
Content-Type: text/html

<HTML><HEAD>
<TITLE>401 Authorization Required</TITLE>
</HEAD><BODY>
...
</BODY></HTML>
.htaccessAuthTypeAuthName の内容が、HTTP の応答の WWW-Authenticate: に現れる。

このページをアクセスするには、クライアント(WWWブラウザ)は、ウインドウ を開いてユーザにユーザ名とパスワードを要求する。そして、次のような GET 要求をもう一度送る。

GET /dir1/file1.html HTTP/1.0[←]
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==[←]
[←]
Authorization: には、ユーザが打ち込んだユーザ名とパスワードが Base64 (64進数)で符合化されて含まれている。 これを受け取ったサーバは、 AuthUserFile で指定されたファイルを開いて、ユーザ名とパスワー ドパスワードを照合して、正しければアクセスを許する。

Base64 は、「暗号ではない」ので、簡単に元にもどせる。

% echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | openssl base64 -d [←]
Aladdin:open sesame% []
AuthType Basic を使うアクセス制御の方法では、パスワードがそのままネッ トワークを流れてしまうので、盗聴に弱い。

◆暗号

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

図? 暗号の考え方

図? 暗号の考え方

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

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

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

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

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

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

利用例

■再帰概念(recurring concepts)

コンピュータのハードウェア、ソフトウェアの作りで繰り返し現れる考え方。

◆3種類の情報処理

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

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

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

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

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

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

◆抽象化、仮想化

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

◆並行性

◆セキュリティ

アクセス制御

◆連想

◆効率

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

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

相転移。


Last updated: 2006/02/27 19:05:41
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>