06 September 2008

(PHP) whoisデータベース

Webアプリを納品して、ログファイルにアクセス元のIPアドレスとホスト名が書かれているので、定期的に見てくださいね。 ということにしておいたところ、IPアドレス見て何が分かるかと聞かれたりすることがある。

まあ、素人ならそうだろね。 月間数万円払って、ログ解析サービスを購入するのが本来は正しいのだろうけど、一応素人ユーザにもIPアドレス何じゃらほいという情報が分かるのを作ってみた。

<html> <body> <?php mb_language('Japanese'); mb_internal_encoding('Shift_JIS'); mb_http_output('Shift_JIS'); $strFilenameThis = 'whois.php'; print("<p>whoisデータベース参照サービス</p>\n"); print("<form method=\"post\" action=\"./".$strFilenameThis."\" name=\"form1\">\n"); print("\t<p>IPアドレス (IP Address) 例:66.249.89.100    <input type=\"text\" name=\"ip_addr\" size=\"30\" maxlength=\"15\" />  \n"); print("\t<input type=\"submit\" value=\"Lookup\" /></p>\n"); print("\t<p>Select database : \n<input type=\"radio\" name=\"db\" value=\"default\" checked=\"checked\" />Default \n"); print("\t<input type=\"radio\" name=\"db\" value=\"ARIN\" />ARIN \n"); print("\t<input type=\"radio\" name=\"db\" value=\"APNIC\" />APNIC \n"); print("\t<input type=\"radio\" name=\"db\" value=\"JPNIC\" />JPNIC \n"); print("\t<input type=\"radio\" name=\"db\" value=\"RIPE\" />RIPE \n"); print("\t<input type=\"radio\" name=\"db\" value=\"AFRI\" />AfriNIC \n"); print("\t<input type=\"radio\" name=\"db\" value=\"DOD\" />US-DOD \n"); print("\t<input type=\"radio\" name=\"db\" value=\"GOV\" />US-GOV \n"); print("\t<input type=\"radio\" name=\"db\" value=\"NET\" />US-NET \n"); print("\t<input type=\"radio\" name=\"db\" value=\"nslookup\" />(nslookup) </p>\n"); print("</form>\n"); if($_POST['ip_addr']) { // IPアドレスが指定された場合 if(!validate_numandperiod($_POST['ip_addr']) || strlen($_POST['ip_addr'])>15 || strlen($_POST['ip_addr'])<8) { print("<p>入力されたアドレスは、IPアドレスで無いようです。<br />IPアドレスの形式は、123.456.012.345 のように数値とピリオドで構成されます</p>\n</body>\n</html>\n"); die; } $strIpAddr = $_POST['ip_addr']; if($_POST['db'] == 'ARIN'){ $strIpAddr = '-a '.$strIpAddr; } if($_POST['db'] == 'APNIC'){ $strIpAddr = '-A '.$strIpAddr; } if($_POST['db'] == 'RIPE'){ $strIpAddr = '-r '.$strIpAddr; } if($_POST['db'] == 'JPNIC'){ $strIpAddr = '-h whois.nic.ad.jp '.$strIpAddr; } if($_POST['db'] == 'AFRI'){ $strIpAddr = '-f '.$strIpAddr; } if($_POST['db'] == 'DOD'){ $strIpAddr = '-d '.$strIpAddr; } if($_POST['db'] == 'GOV'){ $strIpAddr = '-g '.$strIpAddr; } if($_POST['db'] == 'NET'){ $strIpAddr = '-i '.$strIpAddr; } print("<p>調査するIPアドレス (IP Address Looked up) : ".$strIpAddr."</p>\n"); if($_POST['db'] == 'nslookup') { $aryResult = array(); $nRet = NULL; exec('nslookup '.escapeshellcmd($strIpAddr), $aryResult, $nRet); print("<pre>\n"); for($i=0; $i<count($aryResult); $i++) { print(mb_convert_encoding($aryResult[$i], 'SJIS', 'auto')."\n"); } print("</pre>\n"); } else { $aryResult = array(); $nRet = NULL; exec('whois '.escapeshellcmd($strIpAddr), $aryResult, $nRet); print("<pre>\n"); for($i=0; $i<count($aryResult); $i++) { print(mb_convert_encoding($aryResult[$i], 'SJIS', 'auto')."\n"); } print("</pre>\n"); } } // Posix拡張の正規表現でスキャン(ereg)するバージョン function validate_numandperiod($sStr) { if(ereg('/[^0-9\.]/', $sStr)) { // 数値とピリオド以外の文字が発見された場合 return false; } return true; } ?> </body> </html>

mb_convert_string を利用しているのは、JPNICがISO-2022-JP (JIS)を返すから、それをShift-JISに変換するため。