ターミナルの使い方はHWB「15.2 ターミナルの基本的な使い方」が参考になります.
このページでは,Webサーバに対して,POSTコマンド(教科書2.2.3参照)コマンドで1以上15以下の整数xを送ります.サーバは謎の関数fを使ってf(x) を計算して表示します.いろいろなxを入力してみて(「Enter」で入力を送ります),謎の関数fの正体を求めてください.
結果が出るたびに,ブラウザの「戻るボタン」(Safariでは「<」のマーク)で戻ると,別のxをすぐに試してみることができます.
WebブラウザがWebサーバにどのようなHTTPのコマンドを送っているのかは,たとえばGoogle ChromeというWebブラウザでは,その他のツール -> デベロッパーツールを選んで,Network タブでみることができます.
しかし,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 コマンドを送ってみることにチャレンジします.
(打ち込む文字列→) 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」があるので,計算できたことがわかりました.
(打ち込む文字列→) 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> 0f(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' を押して終了する方法です.
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) も計算させて,何が戻ってくるか記録しておいてください.
POST /~ktanaka/sample/f.cgi HTTP/1.1 Host: lecture.ecc.u-tokyo.ac.jp Content-Length: 9 x=tetsuro
今回も,該当ページのアクセス元を東京大学内に限る制限を加えていますが,それをおこなわないと,学外の多くのPCから一度に大量のアクセスがおこなわれて,サーバに悪影響を及ぼす可能性があると判断しました.