PHPでユーザー・アクセス情報を表示する

(1/1)
HTTP通信においては、ブラウザ(クライアント)がホストに対して様々な情報を送信していることはご存じだろうか。
個人を特定できるような情報が送られるというのは都市伝説で、実際には、アクセスしているクライアントの IP アドレスやブラウザの種類が送信されるだけである。それでも、アクセス解析のための情報として重宝する。
そこで今回は、PHP を使って、ブラウザがどのような情報を送っているのか表示するプログラムをつくる。

(2021 年 7 月 4 日)XSS 対策,スタイルシート変更

目次

サンプル・プログラムの実行例

PHPでユーザー・アクセス情報を表示する

サンプル・プログラム

HTTP変数

まずは、ブラウザ(クライアント)が HTTP サーバに送信する HTTP 変数を整理しておこう。
HTTP変数内容
REMOTE ADDRESS現在のページを見ているユーザーのIPアドレス。
REMOTE HOST現在のページを見ているユーザーのホスト名。
ISP特有のホスト名が付いていることが多く、ユーザーがどの地域からアクセスしているのか、だいたいの目安になる。
REMOTE PORTユーザーが利用しているポート番号。
HTTP USER AGENT現在のリクエストにおいてUser_Agent:ヘッダーが定義されている場合にはその内容。
これは、現在のページを見るために使用されているブラウザの種類を示す文字列である。
HTTP REFERERブラウザから現在のページを参照する際のページアドレス。
この変数は、ユーザーのブラウザにより設定される。全てのブラウザが この変数を設定するわけではない。
HTTP ACCEPT LANGUAGE現在のリクエストにおけるAccept-Language:ヘッダーの内容。
ただし、該当するヘッダーがある場合のみ定義される。
HTTP CONNECTION現在のリクエストにおけるConnection:ヘッダーの内容。
ただし、該当するヘッダーがある場合のみ定義される。

サンプル・プログラムの解説

0130: /**
0131:  * HTTP変数一覧を作る
0132:  * @return  string 変数一覧(HTML)
0133: */
0134: function makeCommonBody() {
0135:     //HTTP変数
0136:     $httpvars = array(
0137:         'REMOTE_ADDR'          => 'IPアドレス',
0138:         'REMOTE_HOST'          => 'ホスト名',
0139:         'REMOTE_PORT'          => 'ポート番号',
0140:         'HTTP_USER_AGENT'      => 'ユーザーエージェント',
0141:         'HTTP_REFERER'         => '参照ページアドレス',
0142:         'HTTP_ACCEPT_LANGUAGE' => '言語',
0143:         'HTTP_CONNECTION'      => 'コネクションヘッダ'
0144:     );
0145:     //REMOTE_HOSTがなければgethostbyaddrで取得
0146:     if (!isset($_SERVER['REMOTE_HOST']) || $_SERVER['REMOTE_HOST'] == '') {
0147:         $_SERVER['REMOTE_HOST'] = gethostbyaddr($_SERVER['REMOTE_ADDR']);
0148:     }
0149: 
0150:     //表示用HTML作成
0151:     $caption = TITLE;
0152:     $refere = REFERENCE;
0153:     $version = '<span style="font-size:small;">' . date('Y/m/d版', filemtime(__FILE__)) . '</span>';
0154:     $width  = WIDTH;
0155:     $debug  = '';
0156: 
0157:     //デバッグ情報
0158:     if (! FLAG_RELEASE) {
0159:         $phpver = phpversion();
0160: $debug =<<< EOT
0161: <p>
0162: <span style="font-weight:bold;">★デバックモードで動作中...</span><br />
0163: PHPver : {$phpver}
0164: 
0165: EOT;
0166:     }
0167: 
0168: $html =<<< EOT
0169: <table class="plists">
0170: <caption>{$caption} {$version}</caption>
0171: <tr>
0172: <th>変数</th>
0173: <th>値</th>
0174: <th>説明</th>
0175: </tr>
0176: 
0177: EOT;
0178:     foreach ($httpvars as $key=>$discript) {
0179:         if (isset($_SERVER[$key])) {
0180:             $ss = htmlentities($_SERVER[$key]);      //XSS対策
0181: $html .=<<< EOT
0182: <tr>
0183: <td class="index">{$key}</td>
0184: <td class="value">{$ss}</td>
0185: <td class="description">{$discript}</td>
0186: </tr>
0187: 
0188: EOT;
0189:         }
0190:     }
0191: $html .=<<< EOT
0192: </table>
0193: 
0194: <div style="border-style:solid; border-width:1px; margin:20px 0px 0px 0px; padding:5px; width:{$width}px; font-size:small; overflow-wrap:break-word; word-break:break-all;">
0195: ※参考サイト:<a href="{$refere}">{$refere}</a>
0196: {$debug}
0197: </div>
0198: 
0199: EOT;
0200:     return $html;
0201: }

グローバル配列 $_SERVER に HTTP 変数の値が格納されている。

$_SERVER['REMOTE HOST'] の値がない場合は、組み込み関数  gethostbyaddr  を利用し、DNS に問い合わせて IP アドレスをホスト名に変換するようにしてある。

参考サイト

(この項おわり)
header