セキュリティなどの知識を知る上で重要なもの、それがHTTPです。
HTTPを理解することは、セキュリティを理解することにつながります。
今回は、HTTPの基本を知るために、サーバへのリクエスト・レスポンス通信を具体的に見ていきたいと思います。
僕のプロフィールはこちら
HTTPをまずは知る
冒頭でもお話しした通り、セキュリティを知る上で必要な技術としてHTTPが挙げられます。
このHTTPを知ることは、Webシステムの脆弱性を知ることにつながります。
ですので、HTTPの基礎からしっかりと学んでいきましょう。
HTTP通信を覗いてみよう
さて、まずは以下のようなPHPを実行してみます。
1 2 3 |
<body> <?php echo htmlspecialchars(date('G:i')); ?> </body> |
画面の表示は以下のようになります。
この画面を表示した際に、ブラウザはサーバへの要求としてHTTPリクエストを送信し、サーバはブラウザへの返信としてHTTPレスポンスを返します。
HTTPの内容を覗く際に、今回は「OWASP ZAP」を利用しています。
リクエストメッセージとは
1 2 3 4 5 6 7 8 |
GET http://example.jp/31/31-001.php HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ja,en-US;q=0.7,en;q=0.3 Referer: http://example.jp/31/ Connection: keep-alive Upgrade-Insecure-Requests: 1 Host: example.jp |
リクエストライン
リクエストメッセージの1行目は「リクエストライン」と呼ばれています。
1 |
GET http://example.jp/31/31-001.php HTTP/1.1 |
リクエストラインはWebサーバに対する命令を表しており、
・メソッド
・URL
・プロトコルバージョン
を空白で区切って表しています。
メソッドはGET以外にPOSTやHEADなどがあります。
ヘッダ
リクエストメッセージの2行目以降は「ヘッダ」と呼ばれるもので、名前と値をコロンで区切った形になっています。
ヘッダの内容で重要なのはHOSTだけです。
HOSTはメッセージの送信先ホスト名(FQDN)とポート番号を表します(80の場合は省略可能)。
レスポンスメッセージとは
1 2 3 4 5 6 7 8 9 10 |
HTTP/1.1 200 OK Server: nginx/1.10.3 Date: Sun, 29 Jul 2018 14:28:58 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 20 Connection: keep-alive X-UA-Compatible: IE=edge <body> 23:28</body> |
レスポンスメッセージはWebサーバから返された内容です。
レスポンスメッセージの構造は以下の通りです。
ステータスライン | HTTP/1.1 200 OK |
---|---|
ヘッダ | Server: nginx/1.10.3 Date: Sun, 29 Jul 2018 14:28:58 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 20 Connection: keep-alive X-UA-Compatible: IE=edge |
空行 | |
ボディ | <body> 23:28</body> |
ステータスライン
ステータスラインは、リクエストに対する処理結果のステータスを返します。
■ステータスコードの概要
ステータスコード | 概要 |
---|---|
1xx | 処理が継続している |
2xx | 正常終了 |
3xx | リダイレクト |
4xx | クライアントエラー |
5xx | サーバエラー |
レスポンスヘッダ
レスポンスメッセージの2行目以降はヘッダになります。
以下が重要なものになります。
■Content-Length
ボディのバイト数を表します。
■Content-Type
MIMEタイプというリソースの種類を指定します。
以下は、主なMIMEタイプになります。
MIMEタイプ | 意味 |
---|---|
text/plain | テキスト |
text/html | HTML文書 |
application/xml | XML文書 |
text/css | CSS |
image/gif | GIF画像 |
image/jpeg | JPEG画像 |
image/png | PNG画像 |
application/pdf | PDF文書 |
HTTPは人間の会話と変わらない
HTTPは人の会話と変わりません。
今回で言うと、
「今何時?」
「〇時」
というやりとりをしているだけです。
ただし、人間のようにニュアンスを理解してくれるわけではないので、コードとしてリクエスト・レスポンスをしっかりと示してあげる必要があるわけです。
まとめ
今回はHTTPの基礎を理解しました。
初めての方にはとっつきにくいかもしれませんが、慣れてくると意外と簡単です。
僕も業務で見たりするようになってから苦手意識がなくなったので、慣れるように頑張りましょう!
おすすめ本
僕がセキュリティの勉強をする際に購入した本になります。
この本があれば、セキュリティの基礎は理解できるのでおすすめですよ!