手動でHTTP通信をしてみよう@PHP技術
手動でHTTP通信をしてみよう。
ということで、パケットキャプチャしながらtelnetでHTTP通信をしてみました。
- HTTPでindex.htmlを表示してみよう
まず、DocumentRootに適当なindex.htmlを生成してロードしたいと思います。
[xxxxxx@xxxxx ~]# telnet 192.168.11.90 80 Trying 192.168.11.90... Connected to 192.168.11.90. Escape character is '^]'. GET /index.html HTTP/1.1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>400 Bad Request</title> </head><body> <h1>Bad Request</h1> <p>Your browser sent a request that this server could not understand.<br /> </p> <hr>
ん!?BadRequest?入力文字を間違えた?いや、何回やっても同じ結果。
ブラウザからアクセスすると、正常に表示されている。
→ブラウザのリクエストをパケットキャプチャしてヘッダを少しづつ削除していきました。
結果、Hostヘッダを削除した時点でBadRequestになりました。
調べてみると…
Host: xxx.xxx.jp がないとBadRequestになります。
Hostヘッダは必須ヘッダだそうです。
引用〜
- HTTP/1.1 リクエストを送るクライアントは Host ヘッダを送らなければならない。
- サーバは、HTTP/1.1 リクエストが Host リクエストヘッダを含んでいなければエラー 400 (Bad Request) を知らせなければならない。
余談:
ちなみに、ページに更新がないと304NotModifiedが返ってきてブラウザがキャッシュから表示する(?)みたいです。
- POSTデータを覗いてみよう
入力送信にGETとPOSTがありますが、POSTを覗いてみようと思います。
まず、Formを作ります
<form action="/index.html" method="POST"> <input type="text" name="in1"><br> <input type="radio" name="radio" value="radio1">radio1<br> <input type="radio" name="radio" value="radio2">radio2<br> <input type="submit" value="submit">
そこへPOSTをしてみました。
↓はパケットキャプチャしてみた結果です
内部テキストにGETと同じような表記で書かれていました。だからURLにはでてこないのか〜
- MIMEってなに??
MIMEとは、Web上でやりとりするデータ形式を定義した文字列のことで、WEBサーバーとWEBブラウザの間ではこのMIMEタイプを用いてデータの形式を指定しているそうです。
で、このMIMEを探してみました。
多分、imageやファイルアップロードの時も使っているのかなと見てみたのですが、MIMEというヘッダは無く、AcceptヘッダにMIME文字列っぽい表記があるのを見つけただけでした。
これでいいのでしょうか??
→ファイルアップロードさせた時、[TCP segment of a reassembled PDU]というパケットが大量に流れるのですが、これは一体・・・?
[TCP segment of a reassembled PDU]→TCP層でのパケット分割っぽい
→imgタグに画像を埋め込むと画像分だけリクエストされることがわかりました。そんな仕組みなんじゃないかなーと思っていたのがはっきりした感じです。(CSRFに繋がる)
参考元サイト:
HTTPステータスコード
http://www.asahi-net.or.jp/~AX2S-KMTN/ref/status.html
HTTPヘッダ
http://www.studyinghttp.net/header