4/17 テスト(WebアプリケーションとHTTPプロトコル)


準備

ネットワークプロトコルにしたがって,HTTPプロトコルに従ってWebサーバに対して,コマンドを送ってページの中身を見る方法を学んでください.

ターミナルの使い方はHWB「15.2 ターミナルの基本的な使い方」が参考になります.


謎の関数fの正体を探る

講義用WWWサーバ lecture.ecc.u-tokyo.ac.jp 上に, https://lecture.ecc.u-tokyo.ac.jp/~ktanaka/sample/f.html(このページは東京大学内からのみアクセス可能です)というページを置きました.

このページでは,Webサーバに対して,POSTコマンド(教科書2.2.3参照)コマンドで1以上15以下の整数xを送ります.サーバは謎の関数fを使ってf(x) を計算して表示します.いろいろなxを入力してみて(「Enter」で入力を送ります),謎の関数fの正体を求めてください.

結果が出るたびに,ブラウザの「戻るボタン」(Safariでは「<」のマーク)で戻ると,別のxをすぐに試してみることができます. WebブラウザがWebサーバにどのようなHTTPのコマンドを送っているのかは,たとえばGoogle ChromeというWebブラウザでは,その他のツール -> デベロッパーツールを選んで,Network タブでみることができます.


整数以外のxも送ってみる

https://lecture.ecc.u-tokyo.ac.jp/~ktanaka/sample/f.htmlのテキスト領域はサイズが2しかなく,また,1以上15以下の整数以外の文字を入力しても受け付けないようになっています.

しかし,Webサーバに直接POSTコマンドを送ることによって,それ以外の入力も送ることができます.HWB「10.2 Safariの使い方」「10.2.4 その他の便利な機能」の「ソースを見る」に従うとhttps://lecture.ecc.u-tokyo.ac.jp/~ktanaka/sample/f.htmlのテキストデータを見ることができますが,以下のように入力をするたびに,https://lecture.ecc.u-tokyo.ac.jp/~ktanaka/sample/f.cgi をアクセスしにいくこと,その際にPOSTコマンドを送っていることがわかります.

<form name="form1" method=post action="https://lecture.ecc.u-tokyo.ac.jp/~ktanaka/sample/f.cgi" onsubmit="return check()">
1以上15以下の整数 x を入力してください
<input type="text" name="x" size="2" maxlength="2"><br>
</form>
そこで,ネットワークプロトコルにはなかった POST コマンドを送ってみることにチャレンジします.

f(2)を計算する

まず,ウェブサーバに接続してみます.
(打ち込む文字列→) openssl s_client -crlf -quiet -connect lecture.ecc.u-tokyo.ac.jp:443  (打ち込んだ後に
「Enter」を押そう)
次に,以下の4行を入力します.コピー & ペーストで構いません.コピー & ペーストはHWB「8.3.2.2 カット,コピー,ペースト,アンドゥ」のように,キーボードショートカットでおこなう方法を覚えると高速に行えるようになります.
POST /~ktanaka/sample/f.cgi HTTP/1.1
Host: lecture.ecc.u-tokyo.ac.jp
Content-Length: 3

x=2
すると以下のような応答が返ってくると思います.
x=2
HTTP/1.1 200 OK
Date: Tue, 17 Apr 2018 06:03:09 GMT
Server: Apache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html

38

<html><head></head><body>
 f(2)=2.0
<br></body></html>

0

「f(2)=2.0」があるので,計算できたことがわかりました.

f(12)を計算する

まず,ウェブサーバに接続してみます.
(打ち込む文字列→) openssl s_client -crlf -quiet -connect lecture.ecc.u-tokyo.ac.jp:443   (打ち込んだ後に
「Enter」を押そう)
同じコマンドを実行したことがある場合は,ターミナル上で上向き矢印を押して,古い入力を呼び出して使うことができます(編集もできます).詳しくはHWB「15.コマンド」「15.4 ターミナルの便利な使い方」をご覧ください.

f(2)の入力の時の「x=2」を「x=12」に変えた以下の4行を入力します(コピー & ペーストで構いません).

POST /~ktanaka/sample/f.cgi HTTP/1.1
Host: lecture.ecc.u-tokyo.ac.jp
Content-Length: 3

x=12
すると以下のような応答が返ってくると思います.
HTTP/1.1 200 OK
Date: Tue, 17 Apr 2018 06:08:38 GMT
Server: Apache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html

38

<html><head></head><body>
 f(1)=1.0
<br></body></html>

0
f(12)を計算したかったのに,f(1)が計算されてしまいました.

実は,f(2)の計算の時に,

Content-Length: 3
の「3」は,POSTでWebサーバに送る文字列が「x=2」の3文字なので,そうしたのです. f(12)の計算には「x=12」の4文字を送る必要があるのに,ここを3のままで送ったので,「x=1」までしか読み込まれなかったのでした.

したがって, f(12)を計算するには,

POST /~ktanaka/sample/f.cgi HTTP/1.1
Host: lecture.ecc.u-tokyo.ac.jp
Content-Length: 4

x=12
を送れば良いということになります.試してみて下さい.

注意

ここで,たとえば 
Content-Length: 10000000
などとして入力すると,10000000文字入力するか,数分経ってタイムアウトしないと終了しなくなります.ターミナルのウィンドウを閉じて終了しても良いのですが,お勧めは,'Ctrl' + 'C' を押して終了する方法です.

f(1.5)を計算する

実は関数fは整数以外の入力も受け付けるようになっています.試しに, ウェブサーバに
openssl s_client -crlf -quiet -connect lecture.ecc.u-tokyo.ac.jp:443
で繋がった後で,
POST /~ktanaka/sample/f.cgi HTTP/1.1
Host: lecture.ecc.u-tokyo.ac.jp
Content-Length: 5

x=1.2
と入力して何が戻ってくるかを記録しておいてください.同様にして f(3.7) も計算させて,何が戻ってくるか記録しておいてください.

数以外のデータを入力してみる

x=XXXX の部分に数以外のデータを入れるとどうなるでしょうか? あなたの名前をローマ字読みしたもの(例 「tetsuro」)を与えてみて結果がどうなるかをしらべてみてください. 以下では,x=tetsuro は9文字なので,Content-Length は9としています.
POST /~ktanaka/sample/f.cgi HTTP/1.1
Host: lecture.ecc.u-tokyo.ac.jp
Content-Length: 9

x=tetsuro

ITC-LMSでのテストの受験

4/17 17:00 以降にITC-LMSのテストに「4/17 テスト(WebアプリケーションとHTTPプロトコル)」が出現するので,ここまでを済ませた上でテストを受講してください. 設問2「謎の関数fの正体」は入力が1以上15以下の整数の時を聞いていますが,入力が実数の場合,数でない場合の時の正体が分かった人はそれを答えても構いません(答えられた人がいたら感心はしますが,加点はしません).

この演習の意味

この課題はWebサービスがどう動くかという仕組みを学ぶと共に,情報システムの安心,安全性についても考えてもらう意図で実施しています.サービス提供者側が想定した入力(xは1から15までの整数)以外の入力が来た時に,適切に扱うように作っていないと,「エラーが表示される際にシステムの中身が見られてしまった」,「出力結果が数万行にもなる計算をおこなってしまい,サーバの負荷が上がって,他のユーザにサービスできなくなってしまった」などの問題を生じる怖れがあります.

今回も,該当ページのアクセス元を東京大学内に限る制限を加えていますが,それをおこなわないと,学外の多くのPCから一度に大量のアクセスがおこなわれて,サーバに悪影響を及ぼす可能性があると判断しました.